11.1 命令行参数
可以在执行脚本时,向命令行中添加数据值
如 ./add.sh 10 30
11.1.1 读取参数
命令行中输入的所有参数赋值给一些特殊变量,这些变量称为 位置变量
$0 为程序名称
$1 为第一个参数名称,以此类推,超过10 用 ${10} 表示
注意点:
每个参数都是使用空格分隔,要想在参数中包含空格,就必须使用 ‘ ’ 或者“ ”
引号不作为数据的一部分,他们只定义数据的起止
11.1.2 读取程序名称
使用 参数 $0 可以确定从命令行启动的程序的名称。实际上 $0 是程序的完整路径,
而不是程序名称,basename 只返回程序名称,不带路径
name=`basename $0`
echo the command entered is :$name
11.2 特殊参数变量
有一些特殊的变量用来跟踪命令行参数
11.2.1 参数计数
$# 命令行参数的个数
${!#} 命令行最后一个参数
当命令行没有参数时,$# 值为0 ${!#} 返回脚本名称
获取命令行所有参数 $* $@
$* 将命令行中所有参数作为一个单词处理
$@ 作为一个字符串中的多个单词处理
11.3 移位---改变命令行参数的相对位置
使用shift 命令,默认每个参数变量左移一个位置,于是,$2的值移交给$1, $1的值丢弃,变量
$0 的值和程序名称都保持不变
在不清楚 参数数目的情况下,可以先对第一个参数进行操作,然后对参数进行一次左移,又对第一个
参数进行操作
count=1
while [ -n "$1" ]
do
echo "para #$count=$1 "
count=$[ $count+1 ]
shift
done
11.4 处理选项
1.处理简单选项
while [ -n "$1" ]
do
case "$1" in
-a) echo "find the -a option"
-b) echo "find the -a option"
-c) echo "find the -a option"
*) echo "$1 is not a option"
esac
shift
done
./test15 -a -b -c -d
2. 从选项中分离参数
命令行参数 既有 选项 又 有参数 时 ,使用 -- 分割,-- 代表选项列表的结束
while [ -n "$1" ]
do
case "$1" in
-a) echo "find -a option";;
-b) echo "find -a option";;
-c) echo "find -a option";;
--) shift
break;;
*) echo "default option";;
esac
shift
done
count=1
for para in $@
do
echo "para is #$count=$para"
count=$[ count +1 ]
done
./test16 -a -b -c -- test1 test2
3. 处理带值得选项
while [ -n "$1" ]
do
case "$1" in
-a) echo "find -a option" ;;
-b) para=$2
echo " find the -b option ,with para value $para "
shift 2;;
-c) echo "find -a option" ;;
--) shift
break;;
*) echo "default option";;
esac
shift
done
count=1
for para in $@
do
echo "para is #$count=$para"
count=$[ count +1 ]
done
./test17 -a -b test -c -- mytest1 mytest2
11.6 获取用户输入
11.6.1 基本读取
read 命令接受键盘标准输入 ,并将数据放在一个标准变量中,
如
echo -n "entry your name: "
read name
其中 echo -n 抑制字符串结尾的换行符,允许在字符串后面立即输入数据,而不是在下一行中输入
read -p name 允许在read 命令中直接指定 变量
read 命令行中如果不指定变量 ,接受数据会放到 环境变量 REPLY 中
-t 选项 指定read 命令等待输入的秒数
if read -t 5 -p "please enter your name " name (当计时器满时,read 命令 返回一个非0 退出状态 )
then
echo "hello $name"
else
echo "too slow"
fi
-n read 命令接受字符的个数
read -n1 (只接受一个字符)
-s 将读取的字符隐藏,不在屏幕显示比如密码
11.6.2 读取文件
每调用一次read 命令,读取文件中的一行,当没有可读行时,read 以非0状态退出
count=1
cat test | while read line
do
echo "line $count : $line "
count=$[ count +1 ]
done