Linux(23)—— shell 脚本
这几章笔记是针对redhat8系统中bash的操作指令做记录。
1. shell 脚本建立与运行
shell是脚本中命令的解释器,而脚本可以记录命令执行的过程和执行逻辑,以便以后重复执行,并且可以批量定时执行。
-
建立
在用户级的vim配置文件中添加编写脚本自动定义的部分内容。按下F4唤起Func函数添加内容,新建文件自动添加内容。"map <F4> ms:call FUNC()<cr>'s autocmd BufNewFile *.sh,*.script call FUNC() func FUNC() call append(0,"###############################################") call append(1,"# Author: xxx") call append(2,"# Create_Time: ".strftime("%Y/%m/%d")) call append(3,"") call append(4,"################################################") call append(5,"") call append(6,"#!/bin/bash") endfunc setlocal ts=2 sw=2 et ai
-
运行
sh script.sh #开启指定解释器运行脚本 (新开) source script.sh #在当前shell环境下直接运行脚本 . script.sh chmod +x script.sh /mnt/script.sh #开启脚本指定的环境,运行脚本 (新开) ./script.sh
[root@rhserver Desktop]#sh -x script.sh #逐行运行调试脚本
编写脚本实现host_messages.sh 显示当前主机的名称,ip登陆当前主机的用户:
#!/bin/bash
echo "hostname: `hostname`
ipaddress: `ifconfig ens160 | awk '/inet\>/{print $2}'`
username: $USER"
编写脚本实现清空日志:
#!/bin/bash
[ $USER != "root" ] && {
echo "Permission denied!"
}||{
>/var/log/message
echo "log is cleared!"
}
2. shell 中的变量
变量就是内存一片区域的地址,而用命令无法操作一直变化的目标,因此可以用一串固定的字符(变量)来表示不固定的目标数据。
- 命名规则
变量可以包含字母、下划线以及数字。
但是不能以数字开头。通常短变量名使用全大写字符,变量名较长使用_区分子类如Func_Show2. - 常规变量的定义
a=1 #单个变量
b=(1 2 3 4 5) #数组
# 访问单个变量
echo $ab
echo ${a}b
# 访问数组中的变量
a$[a[@]:起始元素id:元素个数]
${a[0]} #第一个元素
${a[-1]} #最后一个元素
${a[*]} #数组中所有元素
${a[@]} #数组中所有元素
${a[@]:0:3} #数组中前三个元素
${a[@]:1:3} #数组中从第二个开始三个元素
${#a[@]} #数组中元素的个数
unset a[n] #删除数组中的第n个元素
unset a #删除a这个数组
注:数组中删除元素仅清空元素的值,元素顺序不会发生改变,被删除元素对应空值。
-
全局变量的定义
#当前环境 export x=1 #在关闭当前shell后失效(source以及 . 方式运行生效) # 用户级别 vim ~/.bash_profile export x=1 # 系统级别 vim /etc/profile export x=1 # 系统级别一般采用 vim /etc/profile.d/xxx.sh export x=1
- 变量的转义
符号 | 效果 |
---|---|
\ | 转义单个字符 |
" " | 弱引用,批量转义字符 不能转义 \ $ ! |
’ ’ | 强引用 |
-
命令的别名
# 当前环境 alias edit='vim' #在关闭当前shell后失效 # 用户级别 vim ~/.bash_bashrc alias edit='vim' # 系统级别 vim /etc/bashrc alias edit='vim' # 删除当前环境中的alias设定 unalias edit
-
环境变量
# 用户级别 添加/mnt vim ~/.bash_profile export PATH=$PATH:/mnt # 系统级别 添加/mnt vim /etc/bash_profile export PATH=$PATH:/mnt
-
参数传递
命令中参数传递:$()优先运行内容,并且运行结果可以传递 HOST= $(hostname)
脚本中的传参,非交互式 :
$0 # 脚本本身 $1 # 脚本后所输入的第一串字符 $2 $3 $* # 脚本后所输入的所有字符 ( 所有字符串拼接为一个完整 ) $@ # 脚本后所输入的所有字符( 单个字符串, 不拼接 ) $# # 3所有脚本后输入的字符个数
脚本中的传参,交互式 :
read HOST #对HOST赋值 read -p "please input word:" HOST #输出提示语,并给HOST赋值 read -p "please input word:" HOST -s #隐藏输入内容
-
脚本函数
定义:WORD() { action1 action2 }
调用:
WORD #不带括号,代表action1,action2
练习 create_user.sh:
Please input username: username
username exist<output>> usernameis exist>Please input username:
username not exist please input password: 无回显密码
此用户会自动建立并且密码为提示后设定的密码
并显示:username is created
并再次提示Please input username: 当Please input username:exit
此脚本推出
#!/bin/bash
Adduser(){
read -p "Please input username:" ID
[ "$ID" = "exit" -o "$ID" = "EXIT" ] &&{
echo "Bye"
exit
}
id $ID &> /dev/null &&{
echo "$ID is exist!"
Adduser
}||{
read -p "$ID not exist please input password:" -s Passwd
useradd $ID
echo $Passwd | passwd --stdin $ID &> /dev/null
echo -e "\n$ID is created "
Adduser
}
}
Adduser