Shell 脚本语法

语法:

1. echo "Hello World !" //echo 命令用于向窗口输出文本

2.your_name="runoob.com" //变量名定义,变量名和等号之间不能有空格

命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)

3.使用变量 加$ ,加花括号是为了帮助解释器识别变量的边界
echo ${your_name}

4.只读变量 readonly
readonly myUrl

5.删除变量 unset ,不能删除只读变量
unset your_name


6.变量类型
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


二 字符串
1.单引号 双引号区别

双引号内可以引用变量
双引号内可以出现转义字符

2.获取字符串长度
string="abcd"
echo ${#string}

3.提取子字符串
string="runoob is a great site"
echo ${string:1:4} //输出 unoo

4.查找子字符串
查找字符i或o 位置,谁先出现就计算哪个

string="runoob is a great site"

echo `expr index "$string" io` //`是反引号

三 数组

只支持一位数组
1.array=(value1 value2 value3)

array=(
value1
value2
value3
)

2.数组读取
value1=${array[1]}

使用 @ 符号可以获取数组中的所有元素

3.获取数组的长度
length=${#array[@]} 或者 length=${#array[*]}
lengthn=${#array[n]} //获取下标位n元素长度

四、shell 注释

1.#开头 行注释
2. 多行注释
:<<EOF
注释内容
注释内容
注释内容
EOF

五、shell传递参数

向脚本传递参数,脚本内获取参数的格式为:$n

$# :传递到脚本的参数个数
$* :以一个单字符串显示所有向脚本传递的参数
$@ :与$*相同,但是使用时加引号,并在引号中返回每个参数。

六、Shell基本运算符
.expr 表达式
val=`expr 2 + 2`
echo "两数之和为 : $val"
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边

1.算数运算符
+ `expr $a + $b`
-
* `expr $a \* $b`
/ `expr $b / $a`
% `expr $b % $a`
=
== [ $a == $b ] 返回true,false
!= [ $a != $b ]

条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

2.关系运算符
-eq :[ $a -eq $b ] 返回true或者false
-ne
-gt 检测左边数大于右边
-lt
-ge 检测左边数大于等于右边
-le

3.布尔运算符
! 非 [ !false ]
-o 或 [ $a -lt 20 -o $b -gt 100 ]
-a 与 [ $a -lt 20 -a $b -gt 100 ]

4.逻辑运算符
$$ 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]]
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]]

5.字符串运算符

= [ $a = $b ]
!=
-z [ -z $a ] //检测字符串长度是否为0,为0返回 true
-n [ -n "$a" ] //检测字符串长度是否为0,不为0返回 true
$ [ $a ] //检测字符串是否为空,不为空返回 true。

6.文件测试运算符
-b file [ -b $file ] //检测文件是否是块设备文件,如果是,则返回 true。
-c file //检测文件是否是字符设备文件,如果是,则返回 true。
-d file //检测文件是否是目录,如果是,则返回 true。
-f file //检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file //测文件是否设置了 SGID 位,如果是,则返回 true。
-k file //检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file //检测文件是否是有名管道,如果是,则返回 true。
-u file //检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file //检测文件是否可读,如果是,则返回 true。
-w file //检测文件是否可写,如果是,则返回 true。
-x file //检测文件是否可执行,如果是,则返回 true。
-s file //检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file //检测文件(包括目录)是否存在,如果是,则返回 true。


七 echo命令
1.echo "It is a test"

2.echo "\"It is a test\""

3.显示变量
read name
echo "$name It is a test"

4显示换行
echo -e "OK! \n" // -e 开启转义
echo -e "OK! \c" // \c 不换行

5显示结果定向至文件
echo "It is a test" > myfile

6 显示命令执行结果
echo `date`

八 printf 命令

printf format-string [arguments...]

九 流程控制
1.if else 语句

if condition
then
command1
command2
...
commandN
else
command
fi

2.if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

3.if else语句经常与test命令结合使用
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi

4.for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

5. while 语句

while condition
do
command
done

 

int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done

6.until 循环 //until 循环与 while 循环在处理方式上刚好相反
until condition
do
command
done

7.case 语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

8.跳出循环 break和continue。

十 函数
1.自定义函数
[ function ] funname [()]

{

action;

[return int;]

}
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

 

funWithReturn(){
echo "两个数字分别为 $1 和 $2 !" //当n>=10时,需要使用${n}来获取参数
return $(($1+$2))
}
funWithReturn 1 2
echo "输入的两个数字之和为 $? !"


函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

posted @ 2019-10-24 09:33  写程序的猫  阅读(614)  评论(0编辑  收藏  举报