shell脚本学习
- grep root /etc/passwd 查询用户登录的shell解释器
- cat /etc/shells 查看有哪些shell可用
- usermod -s /bin/tcsh root 修改用户的shell解释器
- chsh-s /bin/bash root 修改用户的shell解释器
#!/bin/bash
#注释方式
echo "hello world"
运行脚本方式
chmod +x name.sh
sh name.sh
source name.sh #不会启用子进程,通过pstree查询进程树可以查看区别
变量定义
- 变量名=变量值
取消变量
unset 变量名
注意事项
=等号两端不可以有空格,不可以使用关键字,字母数字下划线开始
变量未定义时在被调用时为空
变量初始化
- 变量有值,则返回该变量的值
- 变量无值,则返回初始值
格式: ${变量:-关键词}
X=123
echo ${X:-xyz}
echo ${adc:-xyz}
查看变量语法
- $变量名
- ${变量名}
#!/bin/bash
x=12
var1=centos
echo $x
echo $var1
echo ${var1}6.5
变量类型
- 环境变量(变量名通常大写,交由操作系统维护)
- 位置变量(bash内置的变量,存储脚本执行时的参数)
- 预定义变量(bash内置变量,可以调用但是不能被赋值)
- 自定义变量(用户自主设置)
环境变量
存储在/etc/profile或者 ~/.bash_profile
命令env可以列出所有环境变量
常见环境变量:PATH PWD USER UID HOME SHELL
echo $PATH
echo $UID
位置变量
存储脚本执行时的参数
使用$n表示,n为数字序列号
$1.$2 … ${10} . ${11}
预定义变量
直接使用这些变量
不能直接为这些变量赋值
变量名 | 含义 |
---|---|
$0 | 当前所在的进程或者脚本名 |
$$ | 当前运行进程的PID号 |
$? | 命令执行后的返回状态,0表示正常,1或者其他值表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
echo $0
echo $$
echo $?
echo $#
echo $*
多种引号的区别
- 双引号 “”:允许扩展,以$引用其他变量
- 单引号’’:禁用扩展,即便使用$也仅仅视为普通字符
- 反引号``:将命令的执行输出作为变量值,等效于 $()
test1=`grep root /etc/passwd`#等效于下列方式
test2=$(grep root /etc/passwd)
echo $test1
echo $test2
字符串操作
字串截取
${变量:起始位置:长度}
phone=13600010001
echo ${#phone} #统计变量长度
echo ${phone:0:3}
echo ${phone:3:3}
echo ${phone:4}
echo ${phone:4:-2}
字串替换
- 替换一个结果
${变量/old/new}
- 替换全部结果
${变量//old/new}
字串去头
- 从左向右,最短匹配删除
${变量#关键字}
- 从左向右,最长匹配删除
${变量##关键字}
A=`head -1 /etc/passwd`
echo $A
echo ${A#*:}
echo ${A##*:}
字串去尾
- 从右向左,最短匹配删除
${变量%关键字}
- 从右向左,最长匹配删除
${变量%%关键字}
A=`head -1 /etc/passwd`
echo $A
echo ${A%:*}
echo ${A%%:*}
批量修改文件扩展名
#!/bin/bash
touch {a,b,c,d,e}.txt
for i in $(ls *.txt)
do
mv $i ${i%.*}.doc
done
read标准输入取值
格式: read [-p “提示信息”] 变量名
-p可选参数 -t可执行超时秒数 -s 设置是否在终端显示输入的字符
read -p "请输入用户名:" name
read -p "请输入密码:" pass
echo $name
echo $pass
变量作用范围
- 局部变量
新定义的变量仅在当前的shell环境中有效,无法在子shell环境中使用 - 全局变量
export x=11 #定义全局变量
在当前的shell及子shell中均有效
$[]算式替换
使用 $[] 或者 $(())表达式
格式 $[整数1 运算符 整数2]
计算结果替换表达式本事,可结合echo命令输出
a=$[1+2]
echo $a
使用let赋值
let i=1+1
echo $i
小数运算 通过bc实现
apt install bc
echo "1.5+2"|bc
echo "1>2"|bc
name=`echo "scale=3;1/2"|bc`
name=$(echo "scale=3;1/2"|bc)
echo $name