ls -a
ls -a c*
cat
1. 命令行参数;
在给一个命令传递参数时,参数之间是通过空格进行分隔的。 在脚本中,使用一个叫“位置参数 ”的特殊变量进行命令行参数的读取 位置参数,就是将一个“$”和参数的位置顺序的一个数字($+position
)结合起来。 比如说 $0
、$1
、$2
分别代表了不同位置上的参数
$0
指的是调用 Shell 脚本程序的程序名$1
、$2
、$3
— $9
是命令行传递进来的参数。前 9 个参数可以这样进行获取。当传递大于 9 个参数时,比如第十个位置的参数,就需要${10}
为参数的序号加一个大括号。
cd /data/shellscript
mkdir userinput
cd userinput
touch add
chmod +x add
vim add
echo "The command name is:$0 "
echo "The #1 param is:$1 "
echo "The #2 param is:${2} "
echo "The #2 param is:${10} "
SUM= $[ $1 +${2} +${10} ]
echo "The result is $SUM "
./add 1 2 3 4 5 6 7 8 9 10
The command name is:./add
The
The
The
The result is 13
touch calc
chmod +x calc
vim calc
name= ` basename $0`
if [ $name = "add" ]
then
result= $[ $1 +$2 ]
elif [ $name = "min" ]
then
result= $[ $1 -$2 ]
fi
echo "the $0 result is $result "
mv add ad_old
ln -s calc add
ln -s calc min
ls -l
lrwxrwxrwx. 1 root root 4 7月 28 20:28 add -> calc
-rwxr-xr-x. 1 root root 221 7月 28 20:11 add_old
-rwxr-xr-x. 1 root root 162 7月 28 20:27 calc
lrwxrwxrwx. 1 root root 4 7月 28 20:28 min -> calc
./add 20 10
./min 20 10
特殊变量
参数计数:$#
,返回所有的参数数量 所有参数:$*
,将所有的参数作为一个参数调用 参数列表:$@
,返回所有参数,是以列表形式调用
touch test_param
chmod +x test_param
vim test_param
echo $
echo $*
echo $@
for var in "$* "
do
echo "\$* param = $var "
done
for var in "$@ "
do
echo "\$@ param = $var "
done
./test_param 1 2 3 4 5
5
1 2 3 4 5
1 2 3 4 5
$* param = 1 2 3 4 5
$@ param = 1
$@ param = 2
$@ param = 3
$@ param = 4
$@ param = 5
2. 命令行参数的处理;
2.1 错误检测:条件判断(参数验证);
vim calc
if [ $
then
echo "please input at least 2 params"
exit
fi
name= ` basename $0`
if [ $name = "add" ]
then
result= $[ $1 +$2 ]
elif [ $name = "min" ]
then
result= $[ $1 -$2 ]
fi
echo "the $0 result is $result "
2.2 移动变量:shift 命令;
当通过命令行传递的参数很多时,处理起来就很麻烦 shift
命令可以进行多参数的处理,它会不断的向前移动位置参数
touch sum
chmod +x sum
vim sum
result= 0
while [ -n "$1 " ]
do
result= $[ $result + $1 ]
shift
done
echo "The numbers of SUM is: $result "
./sum 1 2 3 4 5 6 7 8 9
The numbers of SUM is: 45
2.3 选项处理;
在 Linux 命令中,选项是一种对命令行为进行设置的一种通用方式,它通常的形式就是一个“-
”带上一个字母 很多情况下,选项也会有一个参数
2.3.1 处理简单选项;
touch test_param2
chmod +x test_param2
vim test_param2
while [ -n "$1 " ]
do
case "$1 " in
-a) echo 'option -a' ; ;
-b) echo 'option -b' ; ;
-c) echo 'option -c' ; ;
esac
shift
done
./test_param2 -a -b -c
option -a
option -b
option -c
2.3.2 分离参数和选项;
vim test_param2
while [ -n "$1 " ]
do
case "$1 " in
-a) echo 'option -a' ; ;
-b) echo 'option -b' ; ;
-c) echo 'option -c' ; ;
--) shift
break ; ;
esac
shift
done
echo "params are $* "
./test_param2 -a -b -c -- param1 param2
option -a
option -b
option -c
params are param1 param2
2.3.3 处理带值选项;
vim test_param2
while [ -n "$1 " ]
do
case "$1 " in
-a) echo 'option -a' ; ;
-b) value= "$2 "
echo "option -b, value is $value " ; ;
shift ; ;
-c) echo 'option -c' ; ;
--) shift
break ; ;
esac
shift
done
echo "params are $* "
./test_param2 -a -b 100 -c -- param1 param2
option -a
option -b, value is 100
option -c
params are param1 param2
2.3.4 getopt 命令;
getopt abcd -b -acd
-b -a -c -d --
getopt abcd -b -acd param1 param2
-b -a -c -d -- param1 param2
getopt ab:cd -b value -acd param1 param2
-b value -a -c -d -- param1 param2
vim test_param2
set -- ` getopt -q ab:c "$@ " `
while [ -n "$1 " ]
do
case "$1 " in
-a) echo 'option -a' ; ;
-b) value= "$2 "
echo "option -b, value is $value " ; ;
shift ; ;
-c) echo 'option -c' ; ;
--) shift
break ; ;
esac
shift
done
echo "params are $* "
./test_param2 -ac -b value param1 param2
option -a
option -c
option -b, value is 'value'
params are 'param1' 'param2'
./test_param2 -ac -b "value 123" param1 param2
option -a
option -c
option -b, value is 'value'
params are 'param1' 'param2'
2.3.5 getopts 命令;
touch test_param3
chmod +x test_param3
vim test_param3
while getopts ab:c opt
do
case "$opt " in
a) echo 'option -a' ; ;
b) echo "option -b value is: $OPTARG " ; ;
c) echo 'option -c' ; ;
*) echo "unknown option : $opt " ; ;
esac
done
shift $[ $OPTIND -1 ]
count= 1
for param in "$@ "
do
echo "param #$count is : $param "
count= $[ $count + 1 ]
done
./test_param3 -ac -b "value 123" "param1 123" param2
option -a
option -c
option -b value is: value 123
param
param
2.3.6 选项的标准化。
选项 说明 -a
显示所有对象 -c
生成一个计数 -d
指定一个目录 -e
扩展一个对象 -f
指定读入数据的文件 -h
显示命令的帮助信息 -i
忽略文本大小写 -l
产生输出的长格式版本 -n
使用非交互模式 -o
指定将所有输出重定向的输出文件 -q
以安静模式运行 -r
递归处理目录和文件 -s
以安静模式运行 -v
生成详细输出 -x
排除某个对象 -y
对所有问题回答 yes
3. 在脚本运行时获取输入。
touch read_test1
chmod +x read_test1
vim read_test1
echo "Please type your input"
read input
echo "You typed: $input "
./read_test1
Please type your input
hello world
You typed: hello world
vim read_test1
if read -t 5 -p "Please type your input:" input
then
echo "You typed: $input "
else
echo "timeout"
fi
touch read_test2
chmod +x read_test2
vim read_test2
echo "PLease input a password"
read -s passwd
echo "Your password is : $passwd "
./read_test2
PLease input a password
Your password is : asdf
touch read_test3
chmod +x read_test3
vim read_test3
exec 0< read_test1
count= 1
while read line
do
echo "#$count :$line "
count= $[ $count + 1 ]
done
./read_test3
vim read_test3
count= 1
cat read_test1 | while read line
do
echo "#$count :$line "
count= $[ $count + 1 ]
done
./read_test3