Linux-Shell 脚本基础
[TOC]
命令拼接符
&&
whoami && id #只有当第一条命令执行成功,才会执行第二条命令。
[!NOTE]
如果
&&
命令用在网址(url)中,需要进行 url 编码,把 && 编码为%26%26
||
whoani || id #只有当第一条命令执行失败,才会执行第二条命令
;
whoami;id #执行两条命令,只支持 Linux
&
whoami & id #执行两条命令,Linux 和 windows 都能用
[!NOTE]
Linux 中执行 whoami & id,实际上是把 whoami 放在后台执行,然后再执行 id。
& 是 Linux 后台运行标识符。
windows 中执行
ipconfig & whoami
,& 符只是单纯的命令拼接符,和 Linux 的;
一样。
|
whoami | id
cat /etc/passwd | grep root #执行第一条指令,把第一条指令的输出,
#作为第二条指令的输入,执行第二条指令
VSC 基础使用
下载安装并汉化
- 官方下载
- 汉化——官方插件库搜索“中文”,安装官方汉化包。
VSC 编辑 Linux 中的文件
在 Linux 中安装 Linux 版本的 VSC。
通过 ssh 连接 Linux 编辑。
- 官方插件库搜索
ssh
,安装官方的 ssh 软件Remote - SSH
。 - 在 VSC 界面右侧可以找到
远程资源管理器
。 - 在
远程资源管理器
中进行新建远程,并输入 ssh 连接命令进行连接。 - 点击建立的远程进行连接并输入密码,即可登录。(登陆成功,界面左下角会有提示!!!)
- 设置密钥登陆——点击打开 SSH 配置文件,设置登陆用户名以及私钥路径。
- 官方插件库搜索
Shell 脚本基础
编写脚本
#!/bin/bash #是shebang,用于指定谁来运行这个 Shell 脚本。
#设置运行命令
id
whomai
echo "hello shell!"
[!warning] CRLF 和 LF
Windows 和 Linux 的回车换行可能不同,Linux 中的换行为 LF(\n),Windons 中的为 CRLF(\r\n)。
所以在 Windons 上编写的 Shell 脚本可能无法运行(因为使用的是 CRLF 换行)。
大部分的 IDE 软件都会带有 LF 和 CRLF 的切换。
运行脚本
方法一(不推荐):
#赋予对应的 Shell 脚本执行权限 chmod +x xxx.sh #运行 Shell 脚本 ./xxx.sh
[!note]
不推荐该方法的原因:
当前用户可能不是 bash,比如 kali 是 zsh。
刚好可以运行原因:
- 有 shebang。
- 代码刚好兼容 zsh。
需要预先赋予执行权限。
方法二(推荐):
bash xxx.sh
[!note]
该方法不需要担心 shell 的类型,不需要执行权限。
基础语法
变量
#!/bin/bash
#定义变量
name="xia"
age=18
username=`whoami` #用的是 反引号,功能为执行命令
uid=`id -u` #-u 输出当前用户的 uid
#调用变量
echo $name
echo $age
echo "my name is $name" #用的是双引号,输出:my name is xia
echo "my name is \$name" #添加了转义字符 \,输出:my name is $name
echo 'my name is $name' #用的是单引号输出:my name is $name
echo "my name is $name666" #输出:my name is ,因为没有 name666 变量
#所以该命令中调用的变量输出为空。
echo "my name is ${name}666" #输出:my name is xia666
echo "当前登陆的用户名是:$username" #输出:当前登陆的用户名是:root
echo "当前用户的UID是:$uid" #输出:当前用户的UID是:0
参数
执行以下脚本时,在终端输入命令:
bash demo.sh arg1 arg2 arg3
#!/bin/bash
echo "当前文件的文件名是 $0" #输出:当前文件的文件名是 demo.sh
echo "当前文件的绝对路径是 `pwd`/$0" #输出:当前文件的绝对路径是
#/home/kali/Desktop/shell_scripts/demo.sh
echo "当前文件的绝对路径是 $PWD/$0" #输出:当前文件的绝对路径是
#/home/kali/Desktop/shell_scripts/demo.sh
echo "用户传入的第一个参数是 $1" #输出:用户传入的第一个参数是 arg1
echo "用户传入的第二个参数是 $2" #输出:用户传入的第一个参数是 arg2
echo "用户传入的第三个参数是 $3" #输出:用户传入的第一个参数是 arg3
数学计算
默认数学计算,不支持小数,如果进行小数计算,需要安装 bc 计算器。
#Linux 命令,需要注意一定要加空格,否则会直接输出
expr 1 + 1 #输出:2
expr 1 - 1 #输出:0
expr 2 \* 4 #输出:8
expr 4 / 2 #输出:2
expr 4 % 3 #输出:1
#!/bin/bash
#在 Shell 脚本中使用数学计算
echo "$[1+1]" #输出:2
echo "$[1-1]" #输出:0
echo "$[2*4]" #输出:8
echo "$[4/2]" #输出:2
echo "$[4%3]" #输出:1
结构化命令
if
命令
#!/bin/bash
#如果 命令1 执行成功,就执行 命令2,否则就不执行
if 命令1
then
命令2
fi
#!/bin/bash
#如果 命令1 执行成功,就执行 命令2,否则就执行 命令3
if 命令1
then
命令2
else
命令3
fi
#判断当前用户是否是管理员用户
if [ `id -u` -eq 0 ] #注意:此处的方括号内部左右两边均有一个空格
then
echo "你是管理员"
else
echo "你不是管理员"
fi #当前为 root 用户,所以输出:你是管理员
#当前不是 root 用户,所以输出:你不是管理员
#判断当前的操作系统是否是 kali
if cat /etc/os-release | grep Kali >/dev/null
#>/dev/null 丢弃输出
#if 语句亦可为 grep -q kali /etc/os-release 等
#-q 为安静模式
then
echo "你的操作系统是Kali"
else
echo "你的操作系统不是Kali"
fi
case
命令
#!/bin/bash
echo "请输入数字(0-4):"
read options #read 从标准输入读取一行文本,赋值给变量
case $options in
0) echo "你选择的是0" ;;
1) echo "你选择的是1" ;;
2) echo "你选择的是2" ;;
3) echo "你选择的是3" ;;
4) echo "你选择的是4" ;;
*) echo "无效输入!" ;;
esac
echo "请输入[Y/n]:"
read options
case $options in
Y) echo "继续执行···" ;;
n) echo "退出执行" ;;
*) echo "继续执行···" ;;
esac
#!/bin/bash
#判断当前操作系统是否是 ubuntu / debian / kali / 其他OS
##法一:
if cat /etc/os-release | grep "kali" >/dev/null
then
echo "你的操作系统是kali"
else
if cat /etc/os-release | grep "debian" >/dev/null
then
echo "你的操作系统是debian"
else
if cat /etc/os-release | grep "ubuntu" >/dev/null
then
echo "你的操作系统是ubuntu"
else
echo "你的操作系统是其他操作系统"
fi
fi
fi
##法二:
if [ -f /etc/debian_version ] #-f 判断系统中是否存在 /etc/debian_version
then
. /etc/os-release #加载 /etc/os-release 中的变量
if [ $ID == "ubuntu" ]
then
echo "你的操作系统是ubuntu"
else
if [ $ID == "debian" ]
then
echo "你的操作系统是debian"
else
echo "你的操作系统是kali"
fi
fi
else
echo "你的操作系统是其他操作系统"
fi
##法三
if [ -f /etc/debian_version ]
then
. /etc/os-release
case "$ID" in
ubuntu)
echo "你的操作系统是ubuntu"
;;
debian)
echo "你的操作系统是debian"
;;
kali)
echo "你的操作系统是kali"
;;
*)
echo "你的操作系统是其他操作系统"
;;
esac
else
echo "你的操作系统是其他操作系统"
fi
for in
命令
#!/bin/bash
#以下命令等价于 ls /etc/ssh/ 命令
for files in /etc/ssh/* #读取 /etc/ssh 文件下所有的文件或文件夹
do
echo $files
done
while
命令
#!/bin/bash
var1=10
while [ $var1 -ge 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done
操作符 | 含义 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-lt | 小于 |
-le | 小于或等于 |
-gt | 大于 |
-ge | 大于或等于 |
函数
#!/bin/bash
funtion_name() {
#函数体
echo "0.选项0"
echo "1.选项1"
echo "2.选项2"
echo "3.选项3"
echo "4.选项4"
echo "其他选项,退出程序!"
}
while true #死循环,good!!!
do
funtion_name
echo "请你输入一个选项(0-4)"
read options
case $options in
0) echo "你选择了0" ;;
1) echo "你选择了1" ;;
2) echo "你选择了2" ;;
3) echo "你选择了3" ;;
4) echo "你选择了4" ;;
*) echo "无效输入,退出程序"; exit 0 ;;
esac
done
Linux 环境变量
操作系统自带环境变量
#调出环境变量命令
env
重要环境变量:
USER
:当前的登陆用户名。
HOME
:当前用户家目录。
PATH
:里面保存了一系列 目录路径,这些路径是系统在执行命令时 自动查找可执行程序的地方。
- 输入命令,比如
ls
。- 系统会到 PATH 中的目录 一个个查找 有没有
ls
这个可执行文件。- 找到就执行,找不到就提示
command not found
。
SHELL
:当前的 Shell 类型。