Shell脚本常用命令一览

2022-09-28 19:38:48 浏览数 (1)

[TOC]

0x00 基础命令

sh 命令

描述:Bourne Shell它是bash的前生所以大多用法与bash是一致的;

基础语法

代码语言:javascript复制
sh [options] [file]

#选项
-c string: 命令从-c后的字符串读取。
-i: 实现脚本交互。
-n: 进行shell脚本的语法检查。
-x: 实现shell脚本逐条语句的跟踪。
-s: 用于从标准输入中读取命令,接收命令参数在子shell中执行;

使用案例:

代码语言:javascript复制
#示例1.使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:
sh -x check_ssh_login.sh
  DEFINE=30
  cat /var/log/secure
  awk '/Failed/ {  ip[$(NF-3)]} END {for (i in ip) print i"="ip[i]}'

#示例2.使用-s选项接收命令行中传入的参数
curl -sSL http://weiyigeek.top/test.sh | bash -s "Hello World!"
echo 'echo hello $1' | sh -s 'world'
#hello world
echo 'ls $1 $2' | sh -s '-l' '-h'
#anaconda-ks.cfg

bash 命令(Shell灵魂)

描述:bash 是一个为GNU计划编写的Unix shell,它的名字是一系列缩写Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / Born again), Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

代码语言:javascript复制
#用法:    
bash [GNU 长选项] [选项] ...
bash [GNU 长选项] [选项] 脚本文件 ...

#参数说明
-c:若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数
-n:检测脚本是否正确并不执行脚本,仅仅验证语法;  (常用)
-v: 在执行脚本的时候,先将脚本内容输出到屏幕上然后执行脚本,如有错误则输出; (常用)
-x:执行脚本并输出执行过程调试利器; (常用)

-i:若用-i参数,则bash是交互的
-s:若用-s参数,则bash从标准输入中读入命令(在执行完-c带的命令之后)直到输入exit
-:单一的号表明参数执行完毕,并且屏蔽此后所跟参数,后面的所有变量都被看作是文件名
--norc:如果bash是交互的,则不执行个人初始化文件:-/.bashrc,如果bash作为sh来运行,这个参数缺省是关闭的
--noprofile:不执行系统范围的启动文件/etc/profile也不执行个人的启动文件-/.bash_profile,-/.bash_login或-/.profile,缺省情况下,bash作为登录的shell时以这些文件作为启动文件
--rcfile文件名:如果bash是交互的,则以此文件作为bash的启动文件替代-/.bashrc
--login:激活bash,伪装为登录shell
--nobraceexpansion:不执行大括号扩展
--nolineediting:在交互状态下不使用GNU的readline库去读取命令即取消了命令行编辑功能
--posix:改变bash的行为,使其符合Posix 1003.2规定的标准
--version:在bash开始时显示此bash的版本号--quiet:不显示版本号和其他信息,这是缺省值

Shell 选项:

代码语言:javascript复制
-irsD 或 -c 命令 或 -O shopt选项        (仅适合调用)
-abefhkmnptuvxBCHP 或 -o 选项
#请输入`bash -c "help set"' 以获得关于 shell 选项的更多信息
#请输入`bash -c help' 以获得关于 shell 内嵌命令的更多信息

WeiyiGeek.内建命令

实际案例:

代码语言:javascript复制
#示例1.检测脚本是否正确,并不执行 , 在set命令中也能实现调试
bash -n database.sh    

#示例2.执行脚本,输出执行过程,shell脚本自身已经包含了调式选项,能都打印出脚本接受的参数和输入
bash -x database.sh   #-x 选项是打印所有行的信息
sh -x script.sh #使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:
# test.sh: line 8: ((: 1  : syntax error: operand expected (error token is " ")
#   '[' 1 -le 100 ']'
#   (( sum =1 ))
#   (( 1   ))
# test.sh: line 8: ((: 1  : syntax error: operand expected (error token is " ")
#   '[' 1 -le 100 ']'
#   (( sum =1 ))
#   (( 1   ))

#示例3.子shell(subshells)问题:
#运行一个shell脚本时会启动另一个命令解释器,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件start cmd.bat 里的一系列命令。
#每个shell脚本有效地运行`在父shell(parent shell)的一个子进程里`,这个父shell是指在一个控制终端或在一个`xterm窗口`中给你命令指示符的进程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5

#示例4.如果cmd2 是cd / 那么就会改变子Shell的工作目录,这种`改变只是局限于子shell内部`,cmd5则完全不知道工作目录发生的变化。`子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量`。
unset TERMINFO #清理变量名
set -C #转向所产生的文件

WeiyiGeek.临时环境变量


0x01 输入输出

echo 命令

描述:用于输出指定字符串或者变量的值;

代码语言:javascript复制
echo [选项] "输出内容"
#选项
-n: 一行输出。
-E:不使用反斜杠字符及不激活
-e:激活转义字符,下面是支持反斜杠控制的字符转换列表
   转义符
b  退格键,向左删除键
n  换行符    
r  回车键
t  制表符,Tab键
v  垂直制表符
c  显示不换行
nnn - 按照八进制ASCII码输出字符,其中0为数字零,nnn是三位八进制数
xhh -  按照十六进制ASCII表输出字符,其中hh是两位十六进制数

补充shell 终端字符颜色:终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关shell,python,perl等均可以调用。

代码语言:javascript复制
#说明:转义序列是以 ESC 开头,可以用 33 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, = 用八进制表示的 33)。
33[显示方式;前景色;背景色m #方式1 
E[显示方式;前景色;背景色m   #方式2

#示例:中括号中1:代表开启高亮颜色,末尾0m:代表关闭颜色
e[1;开启颜色;文字颜色;背景颜色 String e[0m关闭颜色 

显示方式: 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显) 
文字颜色:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色) 
背景颜色:重置=0,40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色) 

#Shell Code : 
# echo 显示带颜色需要使用参数-e 
# 字颜色:30—–37 
echo -e "33[30m 黑色字 33[0m"
echo -e "33[31m 红色字 33[0m"
echo -e "33[32m 绿色字 33[0m"
echo -e "33[33m 黄色字 33[0m"
echo -e "33[34m 蓝色字 33[0m"
echo -e "33[35m 紫色字 33[0m"
echo -e "33[36m 天蓝字 33[0m"
echo -e "33[37m 白色字 33[0m"
echo -e "33[40;37m 黑底白字 33[0m"
echo -e "33[41;37m 红底白字 33[0m"
echo -e "33[42;37m 绿底白字 33[0m"
echo -e "33[43;37m 黄底白字 33[0m"
echo -e "33[44;37m 蓝底白字 33[0m"
echo -e "33[45;37m 紫底白字 33[0m"
echo -e "33[46;37m 天蓝底白字 33[0m"
echo -e "33[47;30m 白底黑字 33[0m”

# print 则不需要指定参数
for i in `seq 16 255`; do printf "e[38;5;%sm %st" $i $i;done;echo ""

#Python3
>>> print("33[3;31;40m%s33[0m"%"输出红色字符")
>>> print("33[4;31;40m%s33[0m"%"输出红色字符")

WeiyiGeek.终端字符颜色

控制选项说明:

代码语言:javascript复制
33[0m 关闭所有属性 
33[1m 设置高亮度 
33[4m 下划线 
33[5m 闪烁 
33[7m 反显 
33[8m 消隐 
33[30m — 33[37m 设置前景色 
33[40m — 33[47m 设置背景色 
33[nA 光标上移n行 
33[nB 光标下移n行 
33[nC 光标右移n行 
33[nD 光标左移n行 
33[y;xH设置光标位置 
33[2J 清屏 
33[K 清除从光标到行尾的内容 
33[s 保存光标位置 
33[u 恢复光标位置 
33[?25l 隐藏光标 
33[?25h 显示光标

# Shell
echo -e "33[4C MEasdasdsad 33[0m 33[?25h COOL"  #显示光标并左移动4行
    MEasdasdsad   COOL
echo -e "33[4C MEasdasdsad 33[0m 33[?25l COOL"

实际案例:

代码语言:javascript复制
# 示例1.原样输出变量字符串若需要原样输出变量字符串(不进行转义),请使用单引号。
echo '$name"'  #$name"

# 示例2.转义字符的使用
$echo -e "123b vt345678 101 x30" 
12
        345678 A 0
$echo -e "hvevlnltov"
h
 e
  l
l       o
$echo -e "x68tx65tx6cnx6ctx6f"  #十六进制
h       e       l
l       o
$echo -e "`ls | cat -n`"  #输出行号
     1  bin
     2  boot
     3  dev
     4  etc
echo -e "OK! c"  #显示不换行:
echo "It is a test"


# 示例3.输出带颜色
echo -e "e[1;31m 字符串 e[0m"      #红字默认黑底
echo -e "e[1;31;42m this is a red colore[0m" #40m为背景颜色-红字绿底
echo -e "33[37;31;5mMySQL Server Stop...33[37;47;0m"
echo -e "e[37;31;1;5mMySQL Server Stop...e[37;47;0m"


# 实例4.颜色与控制选项共同组合使用
echo -e "33[37;31;5mMySQL Server Stop...33[39;49;0m"
echo -e "33[37;31;5mMySQL Server Stop...33[39;49;0m"
echo "e[37;31;1;5m n######### weiyigeek - IT ########### e[37;47;0m"

WeiyiGeek.颜色案例

代码语言:javascript复制
#示例4.Echo 也可以输出变量长度
$web=123456
$echo $web
123456
$echo ${#web}    #${#web} 表示web变量中是6位字符
6

#示例5.Echo 也可以计算数值:
#$((运算式)) or $[运算式]    expr or let 数值运算工具  四种方式
$echo "scale=3;4/8"|bc    #"scale保存的小数位数;表达式"|bc  #有效数字
.500

va=1;
vb=2;
echo[$va $vb]   #output :[1 2]
echo$[va vb]    #3

echo $(($va $vb))  #3

let te=$va $vb   #let 没有空格
echo $te   #3

result=`expr 3   1`        #4, 注意等号,两边不能有空格;
$result=`expr $va   1`     #4
$result=$(expr $va   1)     #expr 也可以注意 号两边有space


#示例6.定义和输出数组:
movie[0]=ip && movie[1]=tcp
echo ${movie[n]}  # 单个数字的数组
echo ${movie[*]}  # 显示数组中的全部内容


#示例7.Check External IP (获取外部IP)并采用echo显示
echo -e 'E[32m]' "External IP (外部IP):" 'E[0m' `curl -s http://ipecho.net/plain`
External IP (外部IP):  222.177.8.229
#linux获取外网ip其方法
$ curl -s checkip.dyndns.org | sed 's/.*IP Address: ([0-9.]*).*/1/g'
$ curl ifconfig.me
$ curl icanhazip.com
$ curl ident.me
$ curl ipecho.net/plain
$ curl whatismyip.akamai.com
$ curl tnx.nl/ip
$ curl myip.dnsomatic.com
$ curl ip.appspot.com
$ curl http://ip.3322.net
$ curl icanhazip.com


#示例8.快速清空文件内容的几种方法
$ : > filename #其中的 : 是一个占位符, 不产生任何输出.
$ > filename
$ echo "" > filename
$ echo /dev/null > filename
$ echo > filename
$ truncate -s 0 /tmp/test  
``` 
![WeiyiGeek.echo数组](https://cdn.jsdelivr.net/gh/WeiyiGeek/blogimage/2019/20190611122521.png)

补充:Linux本机的纯字符界面是不支持中文的!

<br/>

实例9.按照错误管道进行输出。
```bash
# 方式1
$ echo >&2 "error: failed to download"
  # error: failed to download 'docker'

# 方式2
cat >&2 <<-'EOW'



	

0 人点赞