异想天开

What's the true meaning of light, Could you tell me why

shell编程点滴

日期:2014-07-16 10:26:34
  
最后更新日期:2015-07-28 17:21:26
【技术文章,非码农勿入】
1.怎么将文本文件的内容一行行作为参数传递给另外一个的命令?
第一次想到用xargs,比如cat foo.txt | xargs ./test.sh,后来发现只执行了一次。应该是xargs只读取管道一次,再后来网上找到一种方法:
[code lang="cpp"]
cat foo.txt | while read LINE
do
#some execute statement
done
[/code]
注意:
这里利用|来分隔,实际上是fork了新进程,while里面并不能修改父进程shell的变量,如需要修改,这样做:
[code lang="cpp"]
while read LINE
do
#some execute statement
done < ./foo.txt
[/code]
2.传递参数给shell脚本? 如执行./test.sh foo bar ,在shell脚本里面,$0表示test.sh,$1表示foo,$2表示bar。

3.shell里面的数组
可以申明,也可以不申明:
[code lang="cpp"]
declare -a ARRAY
ARRAY=$()
[/code]

4.字符串截取
[code lang="cpp"]
hash1=${GCID:0:2} #表示从第0个字符开始2个字符子串
hash2=${GCID:2:2} #表示从第2个字符开始2个字符子串
[/code]

5.怎么在shell和awk里面打印出双引号(")和单引号(')
[code lang="cpp"]
shell只要不同即可,用双引号包单引号,单引号包双引号。echo "'"或echo '"'
awk:
awk '{print "'\''"}'或awk '{print "\""}'
[/code]
注意:这里显示的可能是中文双引号和单引号,与shell里面的英文的不一样

需求:
电信和网通同步文件
做法:
a.先做信任机制,可以不登录直接scp或rsync
b.脚本处理要同步的文件
[code lang="cpp"]
#!/bin/sh
cat ./t_not.txt |while read LINE
do
GCID=$LINE
hash1=${GCID:0:2}
hash2=${GCID:2:2}
#echo $hash1,$hash2
dir2=/usr/local/htdocs/$hash1/$hash2/
file2=$dir2$GCID.html
if [ -f $file2 ];then
echo $file2
scp $file2 www.thinks-bz.com:$file2
fi
done
[/code]

6.shell里面赋值,一般为字符串赋值,lt,gt比较大小时,"123"这样的字符串会转换为数字,然后进行比较。