/#!/bin/bash
echo "Hello World !"
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。
shell变量
-
定义变量
定义变量时,变量名不加($)。 首个字符必须为字母(a-z,A-Z)。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。 重新定义只需重新赋值 若要变量只读只需添加readonly 变量名
-
使用变量
使用定义过的变量,只需变量名前加($)。{}是可选的 删除变量只需 unset 变量名
-
变量类型
1) 局部变量 2) 环境变量 3) shell变量
特殊变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
shell替换
如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。
a=10
echo -e "Value of is $a \n"
转义字符:\\反斜杠,\b退格,\a警告,\f换页,\n换行,\r回车,\t水平制表符,\v垂直制表符
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。
-
命令替换
命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。`command`DATE=`date`
echo "Date is $DATE" 变量替换
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。
Shell运算符
算术运算符:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号。
a=10
b=20
val=`expr $a + $b`
if [ $a == $b ]
then
fi
注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。
关系运算符:
-eq相等, -ne不相等, -gt左是否大于右, lt左小右, -ge左大等右, -le左小等右
if [ $a -eq $b ]
then
fi
布尔运算:
!非, -o 或, -a与
if [ $a -lt 5 -o $b -gt 100 ]
then
fi
字符串运算符:
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
文件测试运算符:
文件测试运算符用于检测 Unix 文件的各种属性。
-b 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-d 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
if [ -r $file ]
then
echo "File has read access"
else
echo "File does not have read access"
fi
数组定义
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开
array_name=(value0 value1 value2 value3)
${array_name[index]}
读取数组
length=${#array_name[*]}
数组长度
echo,printf
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串
printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。
printf "%d %s\n" 1 "abc"
单引号和双引号效果一样
格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s abc def
abcdef
if esle
if .. then ... fi 语句;
if ... else ... fi 语句;
if .. then... elif .. then... else ... fi 语句。
case esac
case 值 in
模式1)
command1
command2
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
for ,while,break
for 变量 in 列表
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while command
do
Statement(s) to be executed if command is true
done
break n 表示跳出n层循环