国外花型设计网站,开店做网站,wordpress投稿积分,做网络营销如何建立自己的网站一、基本介绍
1、如何传递参数
向shell脚本传递数据的最基本方法就是通过命令行参数。如下#xff0c;这条命令会向test.sh脚本传递10和20这两个参数。 ./test.sh 10 20 2、如何读取参数
bash shell会将所有的命令行参数都指派给称作位置参数#xff08;positional parame…一、基本介绍
1、如何传递参数
向shell脚本传递数据的最基本方法就是通过命令行参数。如下这条命令会向test.sh脚本传递10和20这两个参数。 ./test.sh 10 20 2、如何读取参数
bash shell会将所有的命令行参数都指派给称作位置参数positional parameter的特殊变量包括shell脚本名称。 $0对应脚本名 $1对应第一个命令行参数 $2对应第二次命令参数 以此类推直到$9 #!/bin/bash#计算阶乘
factorial1
for (( a 1; a $1; a ))
dofactorial$[ $factorial * $a ]
done
echo $1的阶乘是$factorial. 因为传入的参数之间是以空格分隔的如果传入的参数带有空格就需要使用引号。
#!/bin/bashecho Hello $1, you are a good man.
exit 3、参数超过9个
如果想要传入的参数超过9个需要在第9个位置变量后在变量名的两侧加上花括号如${10}。
#!/bin/bashproduct$[ ${10} * ${11} ]
echo 第10个参数是${10}.
echo 第11个参数是${11}.
echo product的值是$product.
exit 4、读取脚本名 如下示例会将命令名或绝对路径都当成是脚本的名称。
#!/bin/bashecho 脚本的名字是$0
exitbashname命令能返回不包含命令名或绝对路径的脚本名。
#!/bin/bash#使用basename返回不包含路径的shell脚本名
shellname$(basename $0)
echo 脚本名字是$shellname
exit 5、检查命令行参数是否为空
#!/bin/bashif [ -n $1 ] #检查命令行第一个参数是否为空
thenfactorial1for (( a 1; a $1; a ))dofactorial$[ $factorial * $a ]doneecho $1的阶乘是$factorial.
elseecho 你没有提供命令行参数。
fi
exit
二、特殊参数变量
1、$#
特殊变量$#可以获取到shell脚本运行时携带的命令行参数的数量。
#!/bin/bashif [ $# -ne 2 ]
thenecho shell脚本$(basename $0)提供的命令行参数不够。
elsetotal$[ $1 $2 ]echo 两个命令行参数的和是$total
fi
exit 2、${!#}
${!#}获取命令行中的最后一个参数。
#!/bin/bashecho 总共有$#个命令行参数。
echo 其中命令行的最后一个参数是${!#}。
exit3、$*和$ $*变量会将所有的命令行参数视为一个单词而这个单词会包含命令行中出现的每一个参数。$*变量会将这些参数视为一个整体而不是一系列个体。
$变量则会将所有的命令行参数视为同一字符串中的多个独立的单词方便遍历访问。 当$*出现在双引号内时会被扩展成由多个命令行参数组成的单个单词每个参数之间以IFS变量值的第一个字符分隔即“$*”会被扩展为“$1c$2c$3c...”其中c是IFS变量值的第一个字符 当$出现在双引号内时它所包含的各个命令行参数会被扩展成独立的单词即“$”会被扩展为$1$2$3... #!/bin/bashecho 使用\$*方法参数是$*
count1
for param in $*
doecho \$*方法参数#$count $paramcount$[ $count 1 ]
done #!/bin/bashecho 使用\$方法参数是$
count1
for param in $
doecho \$方法参数 #$count $param.count$[ $count 1 ]
done
echo
exit 4、移动参数shift命令
shift命令可以根据命令行参数的相对位置进行移动。默认情况下它会将每个位置的变量值都向左移动一个位置$3的值移入$2$2的值移入$1$1的值会被删除变量$0的值是脚本名不会改变。如果某个参数被移除后那么它的值就被丢弃而无法恢复了。
通过shift命令可以用来遍历命令行参数尤其是在不知道到底有多少参数的时候可以只操作第一个位置变量移动参数然后继续处理该变量。
#!/bin/bashecho #打印空行
echo 使用shift命令进行移位操作。
count1
while [ -n $1 ] #测试第一个参数值的长度当长度为0时结束循环
doecho 参数 #$count $1count$[ $count 1 ]shift
done
echo
exit一次性移动多个位置只需给shift命令提供一个参数指明要移动的位置数 shift n
#!/bin/bashecho
echo 所有的命令行参数是:$
echo 现在向左移动两位。
shift 2
echo 移位后第一个参数是$1
echo
exit 三、处理bash命令中的选项
命令行参数是在命令/脚本名之后出现的各个单词其中以连字符(-)或双连字符(--)起始的参数因为它们能够改变命令的行为所以称作为命令行选项。命令行选项是一种特殊形式的命令行参数。
1、处理简单命令行选项
同样可以使用shift命令处理命令行选项。
#!/bin/bashecho
while [ -n $1 ]
docase $1 in-a) echo 找到-a命令行选项。;;-b) echo 找到-b命令行选项。;;-c) echo 找到-c命令行选项。;;*) echo $1不是一个命令行选项。;;esacshift
done
echo
exit 2、分离命令行参数和选项
在Linux中可以使用双连字符--将命令行选项和参数分开。
#!/bin/bashecho
while [ -n $1 ]
docase $1 in-a) echo -a是命令行选项;;-b) echo -b是命令行选项;;-c) echo -c是命令行选项;;--) shift #在遇到双连字符时需要将其移出位置变量然后用break跳出while循环break;;*) echo $1不是命令行选项esacshift
doneecho
count1
for param in $
doecho 参数#$count:$paramcount$[ $count 1 ]
done
echo
exit不使用双连字符时 使用双连字符时 3、处理含参数的选项 有些命令行选项需要一个额外的参数值。如下所示
#!/bin/bashecho
while [ -n $1 ]
docase $1 in-a) echo -a是命令行选项;;-b) param$2echo -b是命令行选项,且带着参数$paramshift;;-c) echo -c是命令行选项;;--) shift #在遇到双连字符时需要将其移出位置变量然后用break跳出while循环break;;*) echo $1不是命令行选项esacshift
doneecho
count1
for param in $
doecho 参数#$count:$paramcount$[ $count 1 ]
done
echo
exit
由于要处理的命令行选项位于$1,那么额外的参数值就应该在$2前面所有的参数在处理完之后都会被移出所以只要从$2变量中提取出来就可以了。最后因为这个命令行选项占用了两个位置所以还需要使用shift命令多移动一次。 只要记住放置好相应的命令行选项参数无论按什么顺序放置命令行选项都可以。如下所示 4、getopt命令 介绍
getopt命令可以接受一系列任意形式的命令行选项和参数并自动将其转换成适当的形式。 格式 getopt optstring parameters optstring定义了有效的命令行选项的字母同时也定义了哪些命令行选项需要参数值。 先在optstring里列出要在脚本中用到的每个命令行选项字母其次在每个需要参数值的选项字母后面加一个冒号。 示例getopt ab:cd -a -b Bparam -cd test1 test2
optstring定义了4个有效的命令行选项字母a、b、c、d。冒号:放在了字母b的后面表明b命令行选项需要一个参数值。当getopt命令运行时会检查参数列表-a -b Bparam -cd test1 test2并基于提供的optstring进行解析。它会自动将-cd分成两个单独的命令行选项并插入双连字符来分隔命令行中额外的参数。
如果optstring未包含用户指定的选项就会报错。 如果想忽略这条报错使用选项-q 在脚本中如何使用
可以借助能够处理shell中各种变量的set命令。
set命令有一个选项是双连字符--它可以将位置变量的值替换成set命令所指定的值。 首先将脚本的命令行参数传给getopt命令然后再将getopt命令的输出传给set命令用getopt格式化后的命令行参数来替换原始的命令行参数。 set -- $(getopt -q ab:cd $) #!/bin/bash
set -- $(getopt -q ab:cd $)echo
while [ -n $1 ]
docase $1 in-a) echo -a是命令行选项;;-b) param$2echo -b是命令行选项,且带着参数$paramshift;;-c) echo -c是命令行选项;;--) shift #在遇到双连字符时需要将其移出位置变量然后用break跳出while循环break;;*) echo $1不是命令行选项esacshift
doneecho
count1
for param in $
doecho 参数#$count:$paramcount$[ $count 1 ]
done
echo
exit 5、getopts命令 getopt的缺点在于不擅长处理带空格和引号的参数值如果遇到后它会将空格当做参数分隔符而不是根据引号将二者当做一个参数。
getopt与getopts的区别前者在将命令行中的选项和参数处理后只生成一个输出而后者能够和已有的shell位置变量配合默契。
getopts每次只会处理一个检测到的命令行参数在处理完所有的参数后getopts就会退出同时返回一个大于0的退出状态码。使其非常适合用在解析命令行参数的循环中。 格式 getopts optstring variable optstring的用法与在getopt里的一致不同的是如果不想显示错误消息的话可以在optstring之前加一个冒号。optstring中未定义的选项字母会以问号的形式传给脚本。 getopts命令会将当前参数保存在命令行中定义的variable中。 getopts命令需要用到两个环境变量OPTARG和OPTIND前者保存选项加带的参数值后者保存参数列表中getopts正在处理的参数位置这样在处理完当前选项之后就能继续处理其他命令行参数了。
#!/bin/bashecho
while getopts :ab:c opt
docase $opt ina) echo -a是命令行选项;;b) echo -b是命令行选项且带着参数值$OPTARG;;c) echo -c是命令行选项;;*) echo 未知的命令行选项$opt;;esac
done
exit
在解析命令行选项时getopts命令会移除起始的连字符-所以在case语句中不用连字符。 可以在参数值中加入空格 可以将命令行选项字母与参数值写在一起且两者之间不加空格。 getopts命令可以将在命令行中找到的所有未定义的命令行选项统一输出成问号。 getopts命令知道何时停止处理命令行选项并将参数值留给用户处理。在处理每个选项时getopts都会将OPTIND环境变量值加1处理完选项后就可以使用shift命令和OPTIND值来移动参数。
#!/bin/bashecho
while getopts :ab:cd opt
docase $opt ina) echo -a是命令行选项;;b) echo -b是命令行选项且带着参数值$OPTARG;;c) echo -c是命令行选项;;d) echo -d是命令行选项;;*) echo 未知的命令行选项$opt;;esac
doneshift $[ $OPTIND - 1 ]
echo
count1
for param in $
doecho 参数#$count:$paramcount$[ $count 1 ]
done
echo
exit 四、常用的Linux命令行选项
常用的Linux命令行选项 -a显示所有对象-c生成计数-d指定目录-e扩展对象-f指定读入数据的文件-h显示命令的帮助信息-i忽略文本大小写-l产生长格式输出-n使用非交互模式批处理-o将所有输出重定向至指定的文件-q以静默模式运行-r递归处理目录和文件-s以静默模式运行-v生成详细输出-x排除某个对象-y对所有问题回答yes
五、获取用户输入
有时候脚本需要用户更多的交互性比如在脚本运行时询问用户并等待用户的回答。
1、read命令
read命令从标准输入键盘或另一个文件描述符中接受输入获取到输入后它会将数据存入变量。
#!/bin/bashecho -n 请输入你的名字 # -n选项不会在字符串末尾输出换行符允许脚本用户紧跟其后输入数据read name
read -p 请输入你的年龄 age # -p选项允许直接指定提示符。
days$[ $age * 365 ]echo 你好$name. 恭喜你已经活了$days天。
exit read命令会将提示符后输入的所有数据分配给单个变量。如果指定多个变量则输入的每个数据值都会分配给变量列表中的下一个变量如果变量数量不够则剩下的数据就全部分配给最后一个变量。
#!/bin/bashread -p 请输入你的姓与名family_name last_name
echo 你的姓是$family_name,名是$last_name
exit read命令中也可以不指定任何变量如此read命令就会将接收到的所有数据都放进特殊环境变量REPLY中。REPLY环境变量包含输入的所有数据。
#!/bin/bashread -p 请输入你的姓名
echo
echo 你好$REPLY!
exit 2、超时 如果用户一直不输入那么read命令就会一直等待此时可以用 -t 选项指定计时器如果计时器超时read命令会返回一个非0的退出状态码。
#!/bin/bashif read -t 5 -p 请输入你的姓名 name
thenecho 你的姓名是$name
elseechoecho 你一直没有输入所以不再继续等待。
fi
exit 使用read命令的 -n 选项统计输入的字符个数当字符个数达到预期值时就自动退出脚本并将已输入的数据赋给变量。
#!/bin/bash# -n 1告诉read命令在接收到单个字符后就退出。
read -n 1 -p 你是否想继续[Y/N] answercase $answer inY | y) echoecho 好的请继续……;;N | n) echoecho 好的结束。exit;;
esac
echo 脚本已结束。
exit 3、无显示读取
从用户处得到输入但不想在屏幕上显示出用户的输入信息比如输入密码。
-s 选项可以让在read命令中输入的数据出现在屏幕上其实数据还是会被显示只不过read命令将文本颜色设成了和背景色一样
#!/bin/bashread -s -p 请输入你的密码 passwd
echo
echo 你的密码是$passwd
exit4、读取文件
可以使用read命令读取文件。每次调用read命令都会从指定文件中读取一行文本。当文本中没有内容可读时read命令会退出并返回一个非0的退出状态码。
如何将文件的数据传递给read命令最常见的方法是对文件使用cat命令然后将结果通过管道直接传给含有read命令的while命令。
#!/bin/bashcount1
cat $HOME/ning/test.txt | while read line
doecho Line $count$linecount$[ $count 1 ]
done
echo 已处理完该文件。
exit