Shell脚本基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本基础相关的知识,希望对你有一定的参考价值。
Shell脚本
规范Shell脚本的一般组成
#! 环境声明(Sha-Bang)
# 注释文本
可执行代码
设置变量注意事项
若指定的变量名已存在,相当于为此变量重新赋值
等号两边不要有空格
变量名由字母/数字/下划线组成,区分大小写
变量名不能以数字开头,不能用关键字和特殊字符
基本格式
引用变量值:$变量名
查看变量值:echo $变量名、echo ${变量名}
环境变量
一般为大写,用来设置用户/系统环境
PWD PATH USER LOGNAME
SHELL HOME
自定义变量
用户自主设置 使用
例子
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo ${10}
echo $#
echo $*
echo [email protected]
执行
# sh ./1.sh a b c d e f
./1.sh # $0为脚本名称
a # $1为脚本第一个参数
b # $2为脚本第二个参数
c # $3为脚本第三个参数
# $10此处指出为无值状态 如果是"${10}"会将无值赋予变为空值
6 # $#给脚本参数的的个数
a b c d e f # $*列出艘所有参数
a b c d e f # [email protected]列出艘所有参数
#!/bin/bash
cat -n $1 | head -$2 # 查看某文件的前2行
位置变量
在执行脚本时提供的命令行参数(非交互式传值)
$0 $1 $2 $3 ${10}
#无值 不等于 空值
#空值对于变量是属于有值的状态 无值对于变量是属于无值状态
预定义变量
用来保存脚本程序的执行信息
直接使用这些变量
不能直接为这些变量赋值
$# $* [email protected]
$? :执行程序退出后的状态值,0表示正常,其他值异常
###########################################################################################
运算
# expr 10 / 3 #除法
# 3
# expr 10 \* 3 #乘法 *默认为统配符\还原一下
# 30
# expr 1 + 2 #加法
# 3
# expr 3 - 1 #减法
# 2
# expr 10 % 3 #取余
# 1
\ #反斜杠将后一个变量变为纯字符
`` #相当于 $() #将命令执行后的结果输出
# mkdir $(date +%F)date
or
# mkdir `date +%F`date
‘‘ #单引号内安纯字符输出
"" #双引号保留其中变量输出
useradd $user &> /dev/null # $> /dev/null 将输出丢弃(不显示)
&& #逻辑 与
|| #逻辑 或
! #逻辑 否
常用的测试选项
检查文件状态
-e:文档存在为真
-d:文档存在且为目录为真
-f:文档存在且为文件为真
-r:文档存在且有读取权限为真
-w:文档存在且有写入权限为真
-x:文档存在且有执行权限为真
比较整数大小(e=equal g=greater l=less n=not t=than)
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
字符串比对
== #相等
!= #不相等
重定向输出
覆盖:
>:正确输出
2>:错误输出
&>:错误与正确输出
追加:
>>:正确输出
2>>:错误输出
&>>:错误与正确输出
###########################################################################################
if [条件测试1] ; then
命令序列xx
elif [条件测试2] ; then
命令序列yy
else
命令序列zz
fi
例
在 server0 上创建 /root/foo.sh 脚本
1)当运行/root/foo.sh redhat,输出为fedora
2)当运行/root/foo.sh fedora,输出为redhat
3)当没有任何参数或者参数不是 redhat 或者
fedora时,其 错误 输出产生以下信息:
/root/foo.sh redhat|fedora
初步写法:
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘/root/foo.sh redhat|fedora‘
exit
elif [ $1 == redhat ];then
echo fedora
exit
elif [ $1 == fedora ];then
echo redhat
exit
else
echo ‘/root/foo.sh redhat|fedora‘
fi
改进后:
#!/bin/bash
if [ "$1" == redhat ];then # $1在没有赋值时代表 无值 状态无法进行对比 会报错
echo fedora # "$1"会在没有赋值时 给其赋予空值 属于有值状态可以进行对比
exit # 由$1变为"$1"可减少一条空值判断
elif [ "$1" == fedora ];then
echo redhat
exit
else
echo ‘/root/foo.sh redhat|fedora‘ >&2 # >&2 将echo的输出定义为错误输出
exit 1 #退出并将返回值改为1----echo $? 为1
fi
###########################################################################################
for循环结构
循环结构:将反复执行的语句,循环去执行
for 变量名 in 值列表
do
命令序列
done
例
编写一个批量添加用户脚本
在 server0 上创建 /root/batchusers 脚本
1 此脚本要求提供用户名列表文件作为参数
2 如果没有提供参数,此脚本应该给出提示
Usage:/root/batchusers,退出并返回相应值
3 如果提供一个不存在的文件,此脚本应该给出提示
Input file not found,退出并返回相应值
4 新用户的登录Shell为 /bin/false,无需设置密码
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ -f $1 ];then
for A in $(cat $1)
do
useradd -s /bin/false $a
echo $A创建成功
done
else
echo ‘Input file not found‘ >&2
exit 1.
fi
以上是关于Shell脚本基础的主要内容,如果未能解决你的问题,请参考以下文章