Shell学习笔记
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。
Shell 有两种执行的方式:
- 交互式:解释执行用户的命令,用户输入一条命令,Shell就执行一条命令。
- 批处理:用户事先写好一个Shell脚本,其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条的敲入。
第一个shell脚本:
#!/bin/bash //告诉系统用那一种Shell来执行
echo "hello world!"
当完成编写后保存文件为.sh文件(建议用vim编写),
第二步:需要修改文件的权限为可执行权限。
chmod +x ./***.sh //进入到文件所在位置,添加可执行权限
,/***.sh //执行脚本
sh ***.sh //执行脚本
第二个脚本将解释输入:
#!/bin/bash
echo "what is you name?"
read pname //使用read命令从stdin中读取字符串并且将其赋值给pname
echo "hello,$pname"
shell中的变量
(1)变量的定义
pname="张三"
url="www.baidu.com"
num=10
shell脚本中定义变量时变量名不需要加($)
(2)变量的使用
使用一个已经定义过的变量需要在变量名前面加上$
name="zhangsan"
echo $name
有些时候为了能够将变量名和字符串分开需要{}来区分
echo "my name is ${name}."
(3)只读变量
shell中支持只读变量的定义。
age=14
readonly age
如果在下文再对age赋值则运行时会出错。
(4)变量的删除
unset variable_name
变量被删除后不能再次使用;但是unset命令不能删除只读变量。
运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
特殊变量列表
变量 含义
0当前脚本的文件名
n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是
1,第二个参数是
2。
# 传递给脚本或函数的参数个数。* 传递给脚本或函数的所有参数。
@传递给脚本或函数的所有参数。被双引号("")包含时,与
* 稍有不同,下面将会讲到。
?上个命令的退出状态,或函数的返回值。
$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
shell数组
bash支持一维数组,没有限定数组的大小。用空格区分数组元素
array_name(v1 v2 ...vn)
也可以写成如下形式:
array_name=(
v1
v2
v3
v4
)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
shell if-else语句
与C语言相比shell中的if-else中添加了then,then后面的语句将会被执行,此外每一个if还必须要一个fi来闭合如:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
同理if-else语句也一样:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
if … elif … fi 语句
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
shell中的case-esac
case … esac 与其他语言中的 switch … case 语句类似,是一种多分枝选择结构。
用法如下:
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac //与if语句相似,需要用esac语句将其闭合
shell中的for循环
shell中的for循环格式为:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
显示主目录下.bash开头的文件:
#!/bin/bash
for FILE in $HOME/.bash*
do
echo $FILE
done
shell- while循环
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
shell中的until循环
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done