这篇内容包括:shell脚本基础,变量, 配置文件, 算术运算, 条件测试, 退出状态码,test等等 shell脚本:文本文件(命令的堆积) shabang: #!/usr/bin/perl exit 脚本执行到exit 就退出,当然exit [n] 同时还能退出示指定返回值 运行脚本: 语句 创建shell脚本: 1)使用文本编辑器来创建文本文件 第一行必须有shell声明:#!(#!/bin/bash) 添加注释: 以#开头 2)运行脚本 给脚本添加执行权限 直接运行解释器,也就是脚本文件 脚本规范: 脚本调试: 变量: bash中变量的种类: 本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程, 包括当前shell的子shell进程均无效; 环境变量:对当前shell及期子shell都有效,可使用set、env查看export 本地变量名 export 变量名=值 若修改环境变量的值 ,可直接变量名=值而不再需要加export 局部变量:只对当前shell有效 ,可使用set查看 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数; 在SHELL中位置变量一般允许$0-$9这10个位置变量,其中$0代表程序本身, $1-$9代表第一到第九个参数。10个以上可以使用${n}。 特殊变量:$?, $0, $*, $@, $# 本地变量赋值:name='value' 环境变量声明、赋值: declare -x name=VALUE bash内建的环境变量: 声明产生0~9随机数:declare -i number=$RANDOM*10/32768; echo $[$RANDOM%50+1] //显示1到50 随机数 注意:子进程紧会继承父进程的环境变量,子进程不会继承父进程的自定义变量, 需要在父进程export才能使用 环境变量相当于全局变量,自定义变量相当于局部变量。 bash的配置文件: 位置变量:在脚本代码中调用通过命令行传递给脚本的参数 $1, $2, ...:对应第1、第2等参数,shift [n]换位置 进程使用退出状态来报告成功或失败 ping -c1 -W1 hostdown &> /dev/null # -c1 :表示ping的次数 -W1:表示执行的时间,以秒为单位(执行1秒) echo $? # 查看返回值 0表示正常,非0异常 变量引用: $name, ${name} " ":弱引用,其中的变量引用会被替换为变量值; ' ':强引用,其中的变量引用不会被替换为变量值,而保持原字符串; 例如: |
-b file | file存在,并且为块特殊文件,则为真 |
-c file | file存在,并且为字符特殊文件,则为真 |
-d file | file存在,并且为目录,则为真 |
-e file | file存在,则为真 |
-f file | file存在,并且为常规文件,则为真 |
-g file | file存在,并且设置了文件的 SGID 位,则为真 |
-G file | file存在,并且为组所有,则为真 |
-r file | file存在,并且有读权限,则为真 |
-s file | file存在,并且长度大于0,则为真 |
-w file | file存在,并且有写权限,则为真 |
-x file | file存在,并且有执行权限,则为真 |
举例(转)
1、 利用 test 来帮我们写几个简单的例子。首先,判断一下,让使用者输入一个档名,我们判断:
2、检查目录
-d测试会检查指定的文件名是否在系统上以目录形式存在。当写文件到某个目录之前,或者是将文件放
置到某个目录位置之前时,这会非常有用。
上面代码使用了-d测试条件来检查用户的$HOME目录是否存在。如果它存在的话,它将继续使用cd命令来切到$HOME目录并进行显示目录下的文件
3、检查对象是否存在
-e比较允许你在脚本中使用对象前检查文件或目录对象是否存在:
4、检查文件
-e比较适用于文件和目录。但要确定指定的对象是个文件,你必须用-f比较:
5、检查是否可读
在尝试从文件中读取数据之前,最好先测试一下是否能读文件。可以用-r测试。
6、检查空文件
用-s来检查文件是否为空,尤其是在你要删除文件时。当-s比较成功时要特别小心,它说明文件中有数据。
7、检查是否可写
-w比较用来判断你是否对文件有可写权限。
8、检查是否可执行
-x比较是一个简便的断判断你对某个特定文件是否有执行权限的方法。虽然可能大多数命令用不到它,但如果你
要在shell中运行大量脚本,它可能很方便。
9、检查所属关系
-O比较允许你轻松地测试你是否是文件的属主。
10、检查默认属组关系
-G比较会检查文件的默认组,如果它匹配了用户的默认组,那就通过了
实验:
编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即 退 出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
#!/bin/bash
[ $# -eq 0 ] && echo 至少应该给一个参数 && exit 1
grep "^[[:space:]]*$" $1 |wc -l
写一个创建用户的脚本,会询问用户用户名及密码,要求密码输入过程不可见
方法一:
#!/bin/bash
read -p "Please Enter your username: " name
echo -n "Please Enter the password for $name: "
stty -echo
read password
stty echo
echo
useradd $name
echo $password |passwd --stdin $name &> /dev/null
echo "$name created"
方法二:
#!/bin/bash
read -p "Please Enter your username: " name
read -sp "Please Enter the password for $name: " password
echo
useradd $name
echo $password |passwd --stdin $name &> /dev/null
echo "$name created"
转译
\ 完全单个转译
'' 完全范围转译
"" 不完全范围转译对于以下四个符号不可转译
不能去! \ $ `
A="my hostname is $(hostname)"
[root@instructor_v7 app]# echo $A
my hostname is instructor.lisi.com
登录式shell 与 非登录式shell
登录式shell
登录图型化
登录文本tty终端
远程登录如ssh,telnet
su -
执行顺序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式
su
执行shell脚本
在已登录的图型介面打开终端
执行顺序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
source 和 . 在当前shell下执行来自文件的命令。
使用脚本执行 是在子shell下执行命令,那么父shell是无法继承来自脚本中的变量
备注:一般我们经常使用的自定义环境变量脚本放在profile.d下
shell脚本基础练习题---shell练习题