调用shell
告诉系统该脚本该使用何种shell来执行,以#!开头,比如:
#!/bin/bash
表示该脚本是一个bash脚本;调用shell语句只能出现在第一行
注释
使用#注释它至行尾的所有内容,因此如果想在shell语句中使用#号,注意使用屏蔽符号。
执行shell脚本
使用对应的shell命令执行(比如bash script_name),或者.号,或者./。前两种执行方法会省略脚本第一行的shell调用命令,直接用用户当前使用的shell去执行。一般推荐使用./去执行shell脚本。
接收用户输入并赋值给变量
使用“read 变量名”的形式实现,使用$号提取变量中的值:
#!/bin/bash
echo -n "input strings you want todisplay:"
read DISPLAY
echo "$DISPLAY"
Bash中的变量
与其他编程语言不同,Bash中的变量没有数据类型之分;变量中的值都是以字符串的形式保存。如果要进行数值计算,需要进行特殊转换。Shell中的变量主要有以下四类:
Ø 环境变量
保存操作系统(OS)运行时使用的参数;可以通过set命令查看系统中的环境变量;不要随便修改环境变量。常用的环境变量有:
(1)HOME
由/etc/passwd中的用户家目录字段定义,因此不同的用户、该变量对应的值是不同的。
*查看变量的值,可以用echo $HOME命令。
(2)LANG
系统语言,如果想要临时修改系统语言,可以直接给该变量赋值:
LANG=zh_CN.UTF-8
(3)SHELL
交互程序变量,决定了用户当前使用的Shell
(4)PATH
命令搜索路径变量,不用的目录用分号:分隔
(5)PS1
主提示符变量,也就是用户登录后显示的登录提示符,一般如下:
\[\]\h:\w # \[\]
其中的选项参数含义:
\h:当前计算机名
\u:当前使用系统的用户
\w:当前工作路径
\d:当前系统日期
\$:提示符,root是#,普通用户是$
\H:完整的计算机名
\t:24小时的时间格式
\v:当前Bash版本
修改时直接给该变量赋值即可,如:
PS1=’[\d \H \t \v]\$’
(6)PS2
辅助提示符变量,一般在强制换行时、输入这个变量对应的字符,将不执行命令继续等待下一行的输入,一般都是\。
(7)只读环境变量
它们的值无法修改,使用readonly可以查看这些变量。在写脚本时,可以直接引用这些变量的值。
(8)永久修改环境变量
/etc/profile:全局用户配置文件,修改这个文件将影响所有用户。
~/.bash_profile:个人配置文件,只对对应的用户生效
/etc/bashrc:全局环境变量配置文件,定义了所有用户的环境变量
~/.bashrc:个人环境变量配置文件(如果是cshell,文件名为.cshrc)
比如,想将某个用户的登录提示符永久修改,需要在对应的.bashrc中加入:
PS1='\h: '
export PS1
再登录时,提示符就会改变;这里的export表示将PS1转换为该用户的全局变量。
关于环境变量,下一篇笔记会有详细介绍。
Ø 位置变量
执行脚本时传递给脚本的参数
执行脚本时,可以在后面跟上参数传递到脚本中使用。这些变量会存在脚本的位置变量中,以$1~$9表示,($0表示脚本文件名),可以通过下面例子理解:
#脚本内容
#/bin/bash
echo $1
echo $2
#执行
./position_var.sh a b
a
b
*这种方法只能给脚本传递最多9个参数。如果需要传递更多的参数,后面会有专门介绍。
Ø 预定义变量
系统保留和维护的一组特殊变量,通常用于保存程序的运行状态等参数;
$# 传递到脚本的参数个数;
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个;
$$ 脚本运行的当前进程ID号;
$! 后台运行的最后一个进程的进程ID号;
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数;
$- 显示shell使用的当前选项,与set命令功能相同;
$? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误;
$0 保存当前进程或脚本的名称
Ø 自定义变量
用户自定义的变量。
Shell中的自定义变量没有数据类型,不用定义,直接赋值即可。自定义变量都是字符串类型,要想进行运算操作,需要用expr转换。比如:
A=1
B=2
expr $A + $B
*注:运算符前后要有空格!否则会当成是字符串拼接。也就是说上面的运算结果,和:
expr $A+$B
得出的结果是不一样的。
(1)自定义变量的作用域
除非使用export命令,否则只在所在脚本中生效。
(2)将自定义变量转换为只读变量
先定义自定义变量,然后执行:
readonly 变量名
*注:自定义变量转换为只读变量后,这个过程无法逆转。除非重启linux取消这个自定义变量。
(3)清除变量
变量使用完后应及时释放,使用命令:
unset 变量名
Shell数组
定义数组
方法一:直接对所有元素赋值
Array=(1 3 5 7 9)
方法二:单独赋值
Array[0]=1; Array[2]=5
这里由于没有对Array[1]赋值,系统会自动给Array[1]赋一个空值。
要修改数组中某个元素的值,方法和定义数组时一样。
引用数组
引用数组时,要把$放到大括号外边:
${Array[2]}
如果不加下标,直接引用数组名,则默认为引用数组的第一个元素的值:
${Array[0]}与$Array意义相同
一次性引用数组中的所有元素:
echo ${Array[*]}
引用下标大于2的元素:
echo ${Array[@]:2}
查看数组中元素的个数:
echo ${#Array[@]}
举例
1. 猜数字脚本
#!/bin/bash
#Generate a random number from 1 to 10
RAN=`expr $RANDOM % 10`
#Add 1 avoiding RAN equal to 0
RAN=`expr $RAN + 1`
echo "This is a guessing game"
echo "Please the number system generating, range 1-10"
while true
do
echo "Please enter a number you think:"
read TMPNUM
if [ $TMPNUM -lt 1 ] || [ 10 -lt $TMPNUM ]
then
echo "The number you entered is out of range."
continue
fi
if [ $TMPNUM = $RAN ]
then
echo "You guess it!"
unset TMPNUM RAN
exit 0
fi
if [ $TMPNUM -lt $RAN ]
then
echo "The number you guessed is too small."
else
echo "The number you guessed is too large."
fi
done
一定注意方括号前后的空格,否则运行脚本会报错。
2. 随机数排序
生成一组随机数赋值给一个数组,然后对数组中的元素进行使用冒泡排序并输出最终结果。
#!/bin/bash
#Define a Array with random values
Array=($RANDOM $RANDOM $RANDOM $RANDOM $RANDOM)
LENTH=${#Array[@]}
I=0
while [ "$I" -lt "$LENTH" ]
do
J=`expr $I + 1`
while [ "$J" -lt "$LENTH" ]
do
if [ "${Array[J]}" -lt "${Array[I]}" ]
then
TMP=${Array[J]}
Array[J]=${Array[I]}
Array[I]=${Array[J]}
fi
J=`expr $J + 1`
done
I=`expr $I + 1`
done
echo ${Array[@]}
unset Array I J TMP LENTH