命令行参数, positional parameter
$0 完整程序名 (basename 命令可去掉路径 )
$1 第一个参数,超出 9 时 ${10}
$# 参数个数
$* 命令行中的所有参数,作为一个单词
$@ 命令行中的所有参数,作为多个单词
$$ 当前 shell 的 PID
$- shell 的一些属性
$! 前一个后台进程的 PID
echo `basename $0` # 获得程序名
echo ${!#} # 获得最后一个参数
for((i=1; i<=$#; ++i)); do # 遍历参数
echo ${!i} #{} 中不能用 $ ,可使用 ! 替代
done
for a in $@; do # 另一种遍历的方法, $@ 换成 $* 也可以
echo $a
done
shift 命令
改变命令行参数的相对位置,默认左移 1 位,即 $3 变成 $2 , $2 变成 $1 , $1 被丢弃
eg: 另一种遍历参数的方法
while [ -n "$1" ]; do
echo $1
shift
done
getopts 分析参数
read ,获取用户输入
read # 读入到变量 $REPLY 中
read name # 读入到 name
read -p "input your name:" name # 带提示的 read
read name age # 读入以空格分隔的多个变量
read -t 5 name # 等待 5 秒,超时返回失败
if read -t 5 name, then
read -n1 -p "input [Y/N]" answer
# 设置读入的字符数——读入一个字符,这样无须回车,在 emacs 下失败,但终端可以
read -s -p "input pwd" pwd # 不显示输入, emacs 下失败,但普通终端可以
read ,读入文件
一次读入 1 行,不能直接以文件名为参数,需要使用 cat 等命令
cat a.txt | while read line #read 重定向的一个应用吧?
do
echo $line
done
输出
printf "format" a1 a2 ...
eg: printf "af 0x%x" 11 # 格式控制符同 c