shell
Posted 流世幻羽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关的知识,希望对你有一定的参考价值。
//第一个shell #!/bash/bin echo "hello world" //赋予执行权限 chmod +x hello.sh ./hello.sh 或者 sh hello.sh
1,变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写,便于区分。 2,在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。 3,变量用等号连接值,等号左右两侧不能有空格。 4,变量的值如果有空格,需要使用单引号或者双引号包括。
用户自定义的变量由字母或下划线开头,由字母,数字或下划线序列组成,并且大小写字母意义不同,变量名长度没有限制。 设置变量: 习惯上用大写字母来命名变量。变量名以字母表示的字符开头,不能用数字。
变量调用
1,定义时赋值: 变量=值 等号两侧不能有空格 eg: STR="hello world" A=9 2, 将一个命令的执行结果赋给变量 A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A A=$(ls -la) 等价于反引号 eg: aa=$((4+5)) bb=`expr 4 + 5 ` 3,将一个变量赋给另一个变量 eg : A=$STR 变量叠加 eg:#aa=123 eg:#cc="$aa"456 eg:#dd=${aa}789 现象:单引号里的内容会全部输出,而双引号里的内容会有变化 原因:单引号会将所有特殊字符脱意 NUM=10 SUM="$NUM hehe" echo $SUM 输出10 hehe SUM2=‘$NUM hehe‘ echo $SUM2 输出$NUM hehe set //列出所有的变量 unset name //删除变量
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。 export 变量名=变量值 申明变量 作用域:当前shell以及所有的子shell
n为数字,代表命令本身,?1-代表第一到第个参数十以上的参数需要用大括号包含,如?{10}。 | |
---|---|
$* | 代表命令行中所有的参数,把所有的参数看成一个整体。以"?2 … $n"的形式输出所有参数 |
$@ | 代表命令行中的所有参数,把每个参数区分对待。以"?2" … "$n" 的形式输出所有参数 |
$# | 代表命令行中所有参数的个数。添加到shell的参数个数 |
shift指令:参数左移,每执行一次,参数序列顺次左移一个位置,$# 的值减1,用于分别处理每个参数,移出去的参数不再可用
和?@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"?2" … "$n" 的形式输出所有参数
当它们被双引号" "包含时,"会将所有的参数作为一个整体,以?1 ?n"的形式输出所有参数;"会将各个参数分开,以?1""?n" 的形式输出所有参数
shell脚本中执行测试
#!/bin/bash echo "test $*" for i in $* do echo $i done echo "test $@" for i in $@ do echo $i done echo "test "$*"" for i in "$*" do echo $i done echo "test "$@"" for i in "$@" do echo $i done //测试运行shell脚本 sh test.sh a b c d
执行上一个命令的返回值 执行成功,返回0,执行失败,返回非0(具体数字由命令决定) | |
---|---|
$$ | 当前进程的进程号(PID),即当前脚本执行时生成的进程号 |
$! | 后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程 & |
# vi pre.sh pwd >/dev/null echo $$ ls /etc >/dev/null & echo $!
read -t 30 -p "please input your name: " NAME read -s -p "please input your age:" AGE //隐藏查询 read -n 1 -p "please input your sex [M/F]: " GENDER
(注意:运算符前后必须要有空格) num1=11 num2=22 sum =$num1+$num2 expr m + n 或$((m+n)) expr 3 + 5 expr 3 – 5 echo `expr 10 / 3` 10/3的结果为3,因为是取整 expr 3 * 10 是转义符 计算(2 +3 )×4 的值 1 .分步计算 S=`expr 2 + 3` expr $S * 4 2.一步完成计算 expr `expr 2 + 3` * 4 S=`expr `expr 2 + 3` * 4` echo $S 或 echo $(((2 + 3) * 4)) $()与${}的区别 $( )的用途和反引号``一样,用来表示优先执行的命令 eg:echo $(ls a.txt) ${ } 就是取变量了 eg:echo ${PATH} $((运算内容)) 适用于数值运算 eg: echo $((3+1*4))
if/else命令 1, 单分支if条件语句 if [ 条件判断式 ] then 程序 fi 或者 if [ 条件判断式 ] ; then 程序 fi eg:#!/bin/sh if [ -x /etc/rc.d/init.d/httpd ] then /etc/rc.d/init.d/httpd restart fi 单分支条件语句需要注意几个点 if语句使用fi结尾,和一般语言使用大括号结尾不同。 [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格 then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。 2,多分支if条件语句 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件 else 当所有条件都不成立时,最后执行此程序 fi
事例
eg: #!/bin/bash read -p "please input your name:" NAME #echo $NAME if [ “$NAME” == root ] then echo "hello ${NAME}, welcome !" elif [ $NAME == tom ] then echo "hello ${NAME}, welcome !" else echo "SB, get out here !" fi
case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。 格式 CMD=$1 case $CMD in start) echo "starting" ;; Stop) echo "stoping" ;; *) echo "Usage: {start|stop} “ esac
for循环 for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。
事例
第一种: for N in 1 2 3 do echo $N done 或 for N in 1 2 3; do echo $N; done 或 for N in {1..3}; do echo $N; done 第二种: for ((i = 0; i <= 5; i++)) do echo "welcome $i times" done 或 for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done 练习:计算从1到100的加和。
while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。
以上是关于shell的主要内容,如果未能解决你的问题,请参考以下文章