shell基础 [操作系统入门]
0. linux通配符和大括号扩展
- ? 代表任意一个字符
- * 代表0个或多个字符
- {var1, var2} 命令行中这样写,不能有任何空格,只能命令中写,不能在变量赋值时写,会自动将大括号中的值按顺序依次展开。
- ls /root/{var1, var2} 等于输入 ls /root/var1 /root/var2
1. 文件目录操作
- cd
- pwd
- ls
- cp
- mv
- rm
- ln
- mkdri
- rmdir
2. 文件内容查看
- file
- cat
- -n
- -b
- -T
- more
- less
- tail
- -n 数字
- head
- -数字
3. 系统状态
- ps
- -e
- -f
- top
- kill
- mount
- unmount
- df
- du
- -s
- -h
4. 文件处理
- sort
- -n 以数字方式排序
- -M 以三字符的月份名排序
- -t 分隔字符 :
- -k number 以第 number列数值排序
- grep
5. shell 进程
- 通过 bash 命令,开启一个子shell
- 多条命令以 " ; " 分隔可以连续执行
- ( cmd1; cmd2 ... ) : 开启子shell执行命令, 可以嵌套
- {cmd1; } : 不创建了shell
- sleep 秒数 :进程暂停
- & 命令末尾 加这个字符,任务放到后台执行,作业结束,结果会突然出现的屏幕上
- jobs 查看后台作业 -l 显示 进程号
- coproc cmd 协程
- !! 直接执行最近一次执行的命令
- alias 设置命令别名,-p 查看已设置的别名
6. shell变量
6.1. 变量操作命令
- env 只显示全局变量
- printenv 只显示全局变量
- set : 显示所有变量,包括全局变量 和局部变量
6.2. 全局变量和局部变量
- 全局变量 约定全部用大写, export 局部变量名,创建全局变量
- 局部变量,约定全部用小写 varname=value ,等号两边不能有空格
- 子shell 无法改变父shell全部变量的值,只能读取,修改不影响父shell
- 删除环境变量 uset varname
6.3. 登陆shell时加载的命令
- /etc/profile 任何用户登陆都会最先执行
- 该文件中会迭代执行/etc/profile.d目标中的所有sh脚本, 可以将用户登陆即执行的启动文件放在这里
$HOME中的启动文件,大多数发行版中只会用一到两个。
$HOME/.bash_profile 用户登陆时执行
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
? 执行顺序如下,只会执行找到的第一个,其它忽略,$HOME/.bashrc往往其它三个调用运行的
- $HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
6.4. 数组变量
数组变量定义: mytest=(one two three four five), 将值放在括号中,值与值之间以空格隔开。
数组变量可以单独引用,也可以做为整个数组来引用
- ${mytest[2]} three 下标从0开始
- ${mytest[*]} one two three four five 下标* 代表引用整个数组
- mytest[2]=six 重新设置第三个元素的值为six
- unset mytest[2] 删除第三个元素,但是,下标仍然占用,也就是说 mytest[2] 现在是空值,而不four
6.5. 变量引用
- 直接 $varname , varname后必须是空格或者回车,否则shell无法正确识别变量名
- ${varname} 建议使用大括号包裹变量名, 上面数组变量类似。
6.6. 命令替换
反引号字符包裹命令“ ` ”
使用 $() 的形式,这个好理解,$意思是引用变量的值 ,而(cmd)则是开启子shell执行命令。合在一起就是,引用cmd命令的执行结果.
推荐使用第2种方式,反引号,阅读困难,容易出问题。
两种方式都会创建子shell来运行命令
7. 数学运算
7.1. expr命令
expr 5 + 6 所有数字和运算符之间必须有空格,理解:数字和运算符都地expr命令的参数,当然需要空格区分了
7.2. 命令方括号 $[ 5+6]
这种方式,数字和运算符之间不需要空格,有也不会报错,也不用考虑特殊字符的问题。怕种方式只支持整数运算
7.3. 浮点计算
7.3.1. shell 内建bash计算器bc工具
其实bc是一种变种语言,可以交互工作,脚本中使用可以使用管道将数据表达式传递给bc, 如 echo 3*2.5 | bc, 支持设置精度,比如 echo " scale=4 ; 1/3 " | bc 设置4位精度.
8. if 语句
8.1. if 语句
- if
if commandthen
commands
fi
command 命令退出状态码为0,执行then部分的语句,状态码是其它值不执行,
shell 语句可以写到一行,以 " ; " 分隔不同命令,
if command; then commands ; fi
- if...else
if commandthen
commands
else
commands
fi
- if ...elif...elif..efif.......
if command1then
commands
elif command2
then
commands
elif command3
then
commands
fi
8.2. test命令
if 命令只支持命令退出状态码, 不支持其它数字,字符串之类的比较等等,这些条件需要用test命令完成, if 条件写test 命令
命令格式
test conditon
test命令简化写法 , 用方括号定义测试条件,不需要声明test命令
[ conditon ]
如果不写condiotn test以非零退出
数值比较
* n1 -eq n2 检查n1是否与n2相等
* n1 -ge n2 大于 等于
* n1 -gt n2 大于
* n1 -le n2 小于等于
* n1 -lt n2 小于
* n1 - ne n2 不等于
字符串比较
- str1 = str2 相等
- str1 != str2 不等
- str1 < str2 小
- str1 > str2 大
- -n str1 长度是否非零
- -z str1 长度是否为零
文件测试
-d file 是否存在且是一个目录
-e file 是否存在
-f 存在且是一个普通文件
-r 存在且可读
-s 存在且非空
-w 存在且可写
-x 存在且可执行
-O 存在且属于当前用户所有
-G 存在且默认组与当前用户相同
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2旧
复合条件测试
[ condition1 ] && [ conditon2 ] : 且,两个条件同时满足,
将中括号中的条件测试换成命令,可用来做简化的if 判断,第一个命令执行成功才会执行第二个命令,如果第一个失败,不会执行第二个。
[ condition1 ] || [ conditon2 ] : 或,两个条件至少有一个满足,
将中括号中的条件测试换成命令,可用来做简化的if 判断,第一个命令执行失败才会执行第二个命令,如果第一个命令成功,不会执行第二个
8.3. if - then 高级特性
用于数据表达式的双括号, 括号里可以直接表达式计算机及 >. < == 等比较大小
if (( $val1 * 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
用于高级字符串处理的双方括号, 像test一个比较字符串,但支持正则表达式(应该是shell通配符?),下例匹配r开头的字符串
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi
9. 更多结构化命令
9.1. for
for var in list do
comands
done
list默认为空格/tab/回车分隔的字符串, 分隔符由变量IFS定义,重新设置分隔符 IFS=:‘
‘ 分隔符为" : " 或 回车
- one two three
for var in one two three do
comands
done
- 数组变量
var=(one two three four)for var in ${var[*]}
do
comands
done
- 大括号扩展生成列表写法:
- {1..6} 会被展开为 1 2 3 4 5 6
- {a..f} a b c d e f
- {A..F} A B C D E F
for var in {1..6}do
comands
done
- 通过通配符生成的文件列表
for var in /root/*do
comands
done
- 文本文件
cat test.txtoneasdfasfd
two123412
threeasdfafa
for var in $(cat test.txt)
do
comands
done
- C风格for
for (( i=1 ; i< 10; i++))do
commands
done
9.2. while命令
满足条件时继续循环
while command1;command2....do
commands
done
可以用多个测试命令,但只看最后一个命令的退出状态码
9.3. until命令
满足条件时退出循环
until commanddo
commands
done
9.4. case命令
双分号
case $var in pattern1 | pattern2) command1 ;;
pattern3) command2 ;;
pattern4| pattern5) command3 ;;
*) defealt commands
esac
shell基础
以上是 shell基础 [操作系统入门] 的全部内容, 来源链接: utcz.com/z/519351.html