shell编程

shell编程

命名规则
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)
变量赋值
your_name="libai"
# 变量名和等号之间不能有空格
使用变量
your_name="libai"
echo $your_name
echo ${your_name}
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
删除变量
#!/bin/sh
myname="libai"
unset myname    # 删除变量
echo $myname    # 没有任何值输出
变量类型
  • 局部变量** 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 环境变量** 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • shell变量** shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
字符串
单引号字符串
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号字符串
  • 双引号里可以有变量
  • 双引号里可以出现转义字符
your_name='libai'
str="Hello,\"$your_name\"! \n"
删除变量
unset 变量名
位置参数
$0  	为脚本的名字,
$1  	表示第一个参数,
$2 		表示第二个参数,
…
${10} 		表示第十个参数,	
$#  		传递到脚本的参数数量
$@$*  	    表示从$1开始的全部参数.
$?  		上一条命令的退出状态,0表示没有错误 
$$  		脚本运行的进程号
命令替换
  • 命令替换,是将命令的标准输出作为值赋给某个变量。
bash Shell中有两种形式: `命令`$(命令)$(命令)
		例: PD=$(pwd)
`命令`
		例: PD=`pwd`
逻辑控制
  • Shell脚本中还可以包含各种控制结构,if-else分支语句,case分支语句,for循环,while循环等。
test  "$answer"  =  "yes"
# 变量answer的值是否为字符串yes
test  $num –eq  18
# 变量num的值是否为整数18
test  -d  tmp    
# 测试tmp是否为一个目录名
  • 字符串测试

    s1 = s2测试两个字符串的内容是否完全一样
    s1 != s2测试两个字符串的内容是否有差异
    -z s1测试s1 字符串的长度是否为0
    -n s1测试s1 字符串的长度是否不为0
  • 整数测试

    a -eq b测试a 与b 是否相等
    a -ne b测试a 与b 是否不相等
    a -gt b测试a 是否大于b
    a -ge b测试a 是否大于等于b
    a -lt b测试a 是否小于b
    a -le b测试a 是否小于等于b
  • 文件测试

    -d name测试name 是否为一个目录
    -f name测试name 是否为普通文件
    -L name测试name 是否为符号链接
    -r name测试name 文件是否存在且为可读
    -w name测试name 文件是否存在且为可写
    -x name测试name 文件是否存在且为可执行
    -s name测试name 文件是否存在且其长度不为0
    f1 -nt f2测试文件f1 是否比文件f2 更新
    f1 -ot f2测试文件f1 是否比文件f2 更旧
if语句
语法结构1:
 if	表达式
then 命令表
 fi
语法结构2:
if   表达式;  then 
命令表
fi

如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。

if和fi是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条

多条分支case/esac

例子

read YES_OR_NO   
case "$YES_OR_NO" in  
yes|y|Yes|YES)  
	echo "Good Morning!";;  
[nN]*)  
	echo "Good Afternoon!";;  
*)  
	echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."  
esac  

case表示case语句块的开始,esac表示case语句块的结束。

Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以分号结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后.

for循环
语法结构:
for   变量名   in   单词表
do
命令表
done
while循环
  • while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
语法结构:
while     命令或表达式
do
命令表
done
until循环
  • until循环与while循环的功能相似, 所不同的是只有当测试的命令或表达式的值是假时, 才执行循环体中的命令表, 否则退出循环。
语法结构:
until   命令或表达式
do
命令表
done
shell函数

在shell程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。

函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。

调用程序可传递参数给函数, 函数可用return语句把运行结果返回给调用程序。

函数只在当前shell中起作用, 不能输出到子Shell中。

语法结构:
function_name ( )
{
command1
……
commandn
}
调用方式
#方式1
value_name=`function_name  [arg1 arg2 … ]`
# 方式2
function_name  [arg1  arg2  …  ]
echo   $?
例子
check_user( )      #查找已登录的指定用户
{
	  user=`who  |  grep  $1 | wc -l`
        if [ $user –eq 0 ]
        then
               return  0       #未找到指定用户
        else
               return  1       #找到指定用户
        fi
}
while  true         # MAIN, Main, main:   program  begin  here
do
		echo  "Input username: \c"
		read   uname
		check_user  $uname       # 调用函数, 并传递参数uname
		if [ $? –eq  1 ]                 # $?为函数返回值
		then	echo  "user  $uname  online"
		else	echo  "user  $uname  offline"
		fi
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值