这是我参与 8 月更文挑战的第 10 天,活动详情查看: 8月更文挑战web
简介
Shell
是一个用 C 语言编写的程序,它是用户使用 Linux
的桥梁。Shell
既是一种命令语言,又是一种程序设计语言。Shell
是指一种应用程序,这个应用程序提供了一个界面,用户经过这个界面访问操做系统内核的服务。同时,Bash
也是大多数Linux
系统默认的 Shell
。shell
基础使用
可执行文件的执行方式,注意文件开头#!/bin/bash
api
输出重定向
符号 |
说明 |
命令 > 文件 |
以覆盖的方式把命令的正确输出结果保存在文件中 |
命令 >> 文件 |
以追加的方式把命令的正确输出结果保存在文件中 |
命令 2> 文件 |
以覆盖的方式把命令输出的错误信息保存在文件中 |
命令 2>> 文件 |
以追加的方式把命令输出的错误信息保存在文件中 |
命令 &> 文件 |
以覆盖的方式把全部的信息保存在同一个文件中 |
命令 &>> 文件 |
以追加的方式把全部的信息保存在同一个文件中 |
命令 > 文件 2>&1 |
以覆盖的方式把全部的信息保存在同一个文件中 |
命令 >> 文件 2>&1 |
以追加的方式把全部的信息保存在同一个文件中 |
命令 >> 文件1 2>> 文件2 |
把正确信息追加到文件1 错误信息追加到文件2 |
ll > file 把ll命令正确的输出结果保存在file文件中
ll >> file 把ll命令正确的输出结果追加在file文件的最后
ll &>> file 把ll命令执行的全部结果追加在file文件的最后
ll &>> /dev/null 把ll命令的结果都舍弃 /dev/null至关于一个黑洞
复制代码
输入重定向
统计文件中的字符数,分别是行数,单词数,字节数安全
wc < file
复制代码
多命令顺序执行
格式 |
说明 |
命令1 ; 命令2 |
多个命令顺序执行,命令之间没有关联 |
命令1 && 命令2 |
命令1正确执行,命令2才会执行 |
命令1 || 命令2 |
命令1执行不正确,命令2才会执行 |
命令1 | 命令2 |
命令1的正确执行做为命令2的操做对象 |
cd / ; ll
make && make install
cd /test || echo 'not find'
ll | grep test
复制代码
经常使用符号
通配符 |
说明 |
? |
匹配一个任意字符 |
* |
匹配任意内容 |
[] |
匹配括号中的任意一个字符 例如:[a,b],匹配a或b其中一个字符 |
[-] |
匹配一个范围内的一个字符 例如:[a-z],匹配a到z其中一个字符 |
[^] |
匹配一个非括号内的字符 例如:[^0-9],匹配不是0到9的字符 |
rm -rf /* 删除全部文件 跑路必备
find -name *.rc?
复制代码
符号 |
说明 |
' ' |
单引号 在单引号中的特殊符号没有特殊意义 |
" " |
双引号 在双引号中的特殊符号有特殊意义 |
`` |
反引号 用于执行系统命令 |
$() |
也是用于执行系统命令 |
$ |
调用变量 |
# |
注释 |
\ |
转义字符 |
x=1
echo '$x' 没有特殊意义
echo "$x" 拥有特殊意义
time = `date` 执行系统命令
time = $(date) 一样是执行系统命令
echo time 输出对应时间
复制代码
read 读取键盘输入的值
read命令从键盘读取变量的值而后保存在指定变量,一般用在shell脚本中与用户进行交互的场合。bash
选项 |
说明 |
-p |
指定读取值时的提示文字 |
-t |
指定读取值时等待的时间(秒) |
-n |
设定输入的字符数 |
-s |
隐藏输入信息 |
#!/bin/bash
read -p "输入密码:" -s pwd
echo $pwd
复制代码
数值运算
可使用$(())
或$[]
进行数值的运算服务器
sum=$(($1+$2))
sum=$[$1+$2]
复制代码
变量置换
变量置换方式 |
变量y没有设置 |
变量y为空值 |
变量y设置值 |
x=${y-新值} |
x= 新值 |
x 为空 |
x=$y |
x=${y:-新值} |
x= 新值 |
x= 新值 |
x=$y |
x=${y+新值} |
x 为空 |
x= 新值 |
x=新值 |
x=${y:+新值} |
x 为空 |
x 为空 |
x=新值 |
x=${y=新值} |
x= 新值 |
x 为空 |
x=$y |
y= 新值 |
y 值不变 |
y值不变 |
|
x=${y:=新值} |
x= 新值 |
X= 新值 |
x=$y |
y= 新值 |
y= 新值 |
y值不变 |
|
x=${y?新值} |
新值输出到标准错误输出(屏幕) |
x 为空 |
x=$y |
x=${y:?新值} |
新值输出到标准错误输出 |
新值输出到标准错误输出 |
x=$y |
变量
默认变量
变量 |
含义 |
$0 |
当前脚本名称 |
$1 |
脚本接收的第一个参数 |
$2 |
脚本接收的第二个参数 |
$# |
脚本接收的全部参数个数 |
$@ |
脚本接收的全部参数 |
$* |
脚本接收的全部参数 把全部变量当成一个总体 |
$? |
前一行命令的执行状态 |
$$ |
显示当前进程的进程号 |
$! |
显示后台最后一个进程号 |
bash test.sh a b c d
$0 ==> default_var.sh
$1 ==> a
$2 ==> b
$# ==> 4
$@ ==> a b c d
$* ==> a b c d
$? ==> 0
复制代码
局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其余shell启动的程序不能访问局部变量。调用变量要加$符号,注意等号左右不能有空格。markdown
x=1
readonly x 定义只读变量
echo $x
set 查看全部变量
unset 删除变量
复制代码
环境变量
全部的程序,包括shell
启动的程序,都能访问环境变量,有些程序须要环境变量来保证其正常运行。必要的时候shell
脚本也能够定义环境变量。通常环境变量都是大写,便于区分。环境变量好比PATH
,HOME
等。通常是在/etc/profile
, 设置完成以后时候须要使用source /etc/profile
使环境变量生效网络
export NAME=test 定义环境变量
env 查看环境变量
echo $PATH 查看环境变量
echo $HOME
复制代码
declare 申明变量类型
选项 |
说明 |
- |
可用来指定变量的属性 |
+ |
取消变量所设的属性 |
-i |
将变量设置为整数型 |
-x |
指定的变量会成为环境变量,可供shell之外的程序来使用 |
-p |
显示指定变量的声明类型 |
declare - i sum=$1+$2
复制代码
基础语法
echo 打印输出
echo test 直接打印出test
echo test > file 将打印内容写入文件
复制代码
printf 格式化打印
格式替代符 |
说明 |
%ns |
输出n个字符串 |
%ni |
输出n个数字 |
%m.nf |
输出浮点数 指代输出的整数位数和小数位数 例如%8.2f,表明共输出8位,其中2位小数,6位整数 |
序列 |
说明 |
\a |
发出警告音 |
\b |
后退 |
\f |
换页(formfeed) |
\n |
换行 |
\r |
回车(Carriage return) |
\t |
水平制表符 |
\v |
垂直制表符 |
printf %s abcdef
printf "%s %s %s\n" a b c d e f g h i j
复制代码
cut 提取列
选项 |
说明 |
-f |
截取指定列 |
-d |
-d:指定字段的分隔符,默认的字段分隔符为“TAB”; |
cut -d ':' -f 1 /etc/passwd
复制代码
test 条件判断
选项 |
说明 |
-e |
判断文件是否存在 |
-d |
若是文件为一个目录,则为真 |
-f |
若是文件为一个普通文件,则为真 |
-L |
判断文件是否存在,而且要为连接文件 |
-z |
判断变量是否为空 |
-a |
多重判断 |
-r |
判断文件是否有读权限 |
-w |
判断文件是否有写权限 |
-x |
判断文件是否有执行权限 |
test -f file
[ -f file ]
echo $?
[ -f file ] && echo "文件存在" || echo "文件不存在"
[ -z "$name" ] && echo "变量为空" || echo "变量不为空"
[ "$x" == "$y"] && echo "两个变量相等" || echo "两个变量不相等"
[ -f file -a -w file ]
复制代码
流程控制
if 判断
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
exit 1
fi
if [ $a == $b ]; then
fi
复制代码
case 多选择判断
read -p "请输入数字" Num
case $Num in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
复制代码
for循环
遍历数字
for num in 1 2 3
do
echo "The value is: $num"
done
遍历字符串
for str in 'This is a string'
do
echo $str
done
打印根目录全部文件
ls / > /root/file.log
for i in $(cat file.log)
do
echo $i
done
常规for循环
for ((i=0;i<10;i=i+1))
do
echo $i
done
复制代码
while循环
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
复制代码
until 循环
until
循环执行一系列命令直至条件为 true
时中止。框架
until
循环与 while
循环在处理方式上恰好相反。运维
int=1
until(( $int>=5 ))
do
echo $int
let "int++"
done
复制代码
推荐阅读
Linux sudo和sudoers详解!
Linux TCP内核参数设置与调优(详细)!
运维必定要知道的Linux RAID详解!
Linux服务管理(详解)!
网络安全人员必定要知道的Metasploit渗透框架!
渗透必备-Metasploit经常使用模块的用法
服务器硬件指南!