码迷,mamicode.com
首页 > 系统相关 > 详细

shell基础

时间:2020-09-18 04:13:27      阅读:38      评论:0      收藏:0      [点我收藏+]

标签:意思   设置   正则表达   变量定义   com   退出   list   别名   运行命令   

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. 数组变量

  1. 数组变量定义: mytest=(one two three four five), 将值放在括号中,值与值之间以空格隔开。

  2. 数组变量可以单独引用,也可以做为整个数组来引用

  • ${mytest[2]} three 下标从0开始
  • ${mytest[*]} one two three four five 下标* 代表引用整个数组
  • mytest[2]=six 重新设置第三个元素的值为six
  • unset mytest[2] 删除第三个元素,但是,下标仍然占用,也就是说 mytest[2] 现在是空值,而不four

6.5. 变量引用

  1. 直接 $varname , varname后必须是空格或者回车,否则shell无法正确识别变量名
  2. ${varname} 建议使用大括号包裹变量名, 上面数组变量类似。

6.6. 命令替换

  1. 反引号字符包裹命令“ ` ”

  2. 使用 $() 的形式,这个好理解,$意思是引用变量的值 ,而(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 语句

  1. if
if command
then
	commands
fi

command 命令退出状态码为0,执行then部分的语句,状态码是其它值不执行,

shell 语句可以写到一行,以 " ; " 分隔不同命令,

if command; then commands ; fi
  1. if...else
if command
then
	commands
else
	commands
fi
  1. if ...elif...elif..efif.......
if command1
then
	commands
elif command2
then
	commands
elif command3
then
	commands
fi

8.2. test命令

if 命令只支持命令退出状态码, 不支持其它数字,字符串之类的比较等等,这些条件需要用test命令完成, if 条件写test 命令

  1. 命令格式

    test conditon
    

    test命令简化写法 , 用方括号定义测试条件,不需要声明test命令

     [ conditon ]
    

    如果不写condiotn test以非零退出

  2. 数值比较

    * n1 -eq n2 检查n1是否与n2相等
    * n1 -ge n2 大于 等于
    * n1 -gt n2 大于
    * n1 -le n2 小于等于
    * n1 -lt n2 小于
    * n1 - ne n2 不等于

  3. 字符串比较

    • str1 = str2 相等
    • str1 != str2 不等
    • str1 < str2 小
    • str1 > str2 大
    • -n str1 长度是否非零
    • -z str1 长度是否为零
  4. 文件测试

    -d file 是否存在且是一个目录

    -e file 是否存在

    -f 存在且是一个普通文件

    -r 存在且可读

    -s 存在且非空

    -w 存在且可写

    -x 存在且可执行

    -O 存在且属于当前用户所有

    -G 存在且默认组与当前用户相同

    file1 -nt file2 file1比file2新

    file1 -ot file2 file1比file2旧

  5. 复合条件测试

    [ 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=:‘\n‘ 分隔符为" : " 或 回车

  • 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.txt
oneasdfasfd
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 command
do
  commands
done

9.4. case命令

双分号

case $var in 
  pattern1 | pattern2) command1 ;;
  pattern3) command2 ;;
  pattern4| pattern5) command3 ;;
  *) defealt commands
esac

shell基础

标签:意思   设置   正则表达   变量定义   com   退出   list   别名   运行命令   

原文地址:https://www.cnblogs.com/wyf368/p/13685387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!