//第一个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循环。
浙公网安备 33010602011771号