处理命令行参数
测试: sh test.sh -b qiao -a -c -- asdf sd w w
#!/bin/bash
while getopts :ab:c opt
do
case "$opt" in
a) echo fund -a;;
b) echo fund -b with option $OPTARG;;
c) echo fund -c ;;
*) echo unknown arg $opt;;
esac
done
#echo $* $OPTIND
shift $[ $OPTIND - 1 ]
count=1
for i in "$@"
do
echo para $count is $i
count=$[ $count+1 ]
done
读取命令
#!/bin/bash
read -p "Enter your name please:" first last
echo Welcom $last.$first
read -p "And your favourate?:"
echo Your favourate is : $REPLY
设置超时时间:
#!/bin/bash
# timing read
if read -t 5 -p "请输入姓名:" name
then
echo Welcom $name!
else
echo "Sorry, timeout!!"
fi
~
~
读取文件:
#!/bin/bash
#读取文件测试
cat /etc/passwd | while read line
do
echo Line: $line
IFS_OLD=$IFS
IFS=:
for value in $line
do
echo " $value"
done
IFS=$IFS_OLD
done
~
信号
禁止中断 (使用trap命令)
#!/bin/bash
trap "echo '您不能中断执行'" SIGINT SIGTERM
echo "测试开始"
count=1
while [ $count -lt 5 ]
do
echo "Loop #$count"
sleep 3
count=$[$count+1]
done
函数
#!/bin/bash
echo "Now Program [$(basename $0)] Begin. PID: $$ TIME:$(date)"
function addem {
if [ $# -le 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
r1=$(addem 1 3)
r2=$(addem 1)
r3=$(addem)
echo r1:$r1 r2:$r2 r3:$r3
函数里的全局变量: 默认都是全局的
#!/bin/bash
echo "Now Program [$(basename $0)] Begin. PID: $$ TIME:$(date)"
function dbl {
value=$[ $value*2]
}
read -p"Please enter a value:" value
dbl
echo the new value is $value
数组传参
#!/bin/bash
echo "Now Program [$(basename $0)] Begin. PID: $$ TIME:$(date)"
function testarray {
local newArray=(`echo "$@"`)
echo the new array in func is : ${newArray[*]}
}
myarray=(one two three)
echo the original array is : ${myarray[*]}
testarray ${myarray[*]}
返回数组
#!/bin/bash
echo "Now Program [$(basename $0)] Begin. PID: $$ TIME:$(date)"
function testarray {
local arr=(2 3 4 5)
echo ${arr[*]}
}
myarray=$(testarray)
echo the array is : ${myarray[*]}
递归(斐波那契数列)
#!/bin/bash
function factorial {
if [ $1 -eq 1 ]
then
echo $1
else
local tmp=$(factorial $[ $1-1 ])
echo $[ $tmp * $1 ]
fi
}
read -p"Please enter:" val
result=$(factorial $val)
echo The factorial of $val is $result
sed 与 gawk
统计 $PATH 中各个目录中文件的个数
#!/bin/bash
allPath=$(echo $PATH | sed 's/:/ /g')
for dir in $allPath
do
check=$(ls $dir)
count=0
for file in $check
do
count=$[ $count+1 ]
done
echo $dir - $count
done
给数字添加“ ,” ,其中的正则表达式为:
#!/bin/bash factorial=1 counter=1 read -p"Enter a number:" number #number=$1 while [ $counter -lt $number ] do factorial=$[ $factorial * $counter] counter=$[ $counter+1 ] done echo Original data: $factorial result=$(echo $factorial | sed '{ :start s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ t start }') echo $result
每行前添加行号
sed '=' test.txt sed 'N;s/\n/ /'
删除多余空白行 (连续空白多余一行)
sed '/./,/^$/!d' test.txt
实用工具
列出家目录下,按大小排序的前十名的文件,并输出总大小
du --max-depth=1 ~ | sort -nr | sed "=" | sed "N; s/\n/ /g" | sed '{11,$D}' |gawk 'BEGIN{total=0}{total+=$2;print $1":",$2,$3;}END{print "TOTAL:"total}'
du --max-depth=1 ~ | sort -nr | sed "=" | sed "N; s/\n/ /g" | sed '{11,$D}' |gawk 'BEGIN{total=0}{total+=$2;print $1":",$2,$3;}END{print "TOTAL:"total}'
shell中的${},##和%%的使用