51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

linux 系列教程 shell 简单入门

linux 系列教程 shell 简单入门 {#linux-%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B-shell-%E7%AE%80%E5%8D%95%E5%85%A5%E9%97%A8}

https://cloud.189.cn/t/ayiE3qvUJ3me (访问码:mj5u)

linux shell 简单入门

下面是linux shell bash 基本入们篇 上面链接是一系列教程 {#%E4%B8%8B%E9%9D%A2%E6%98%AFlinux-shell-bash-%E5%9F%BA%E6%9C%AC%E5%85%A5%E4%BB%AC%E7%AF%87-%E4%B8%8A%E9%9D%A2%E9%93%BE%E6%8E%A5%E6%98%AF%E4%B8%80%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B}

一般百度 关键字 就是、截取字符串、删除字符串、替换字符串、查找文件、查找包含字符串的文件


上面这些 代码稀奇古怪 拿来尝试就可以找到合适自己的代码


下面是我的 写 shell bash 脚本的心得总结


先讲一下权限问题,在普通用户下是没有root权限。

简单理解就 root权限 具有操作根(系统)目录的全部权限,而普通用户不可以

#-------------------------------------------------------

普通用户可以之直接操作的目录路径有以下 {#%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E5%8F%AF%E4%BB%A5%E4%B9%8B%E7%9B%B4%E6%8E%A5%E6%93%8D%E4%BD%9C%E7%9A%84%E7%9B%AE%E5%BD%95%E8%B7%AF%E5%BE%84%E6%9C%89%E4%BB%A5%E4%B8%8B}

  1. /home/用户名 这个俗称用户目录/家目录,桌面 文档 等文件夹都在这里

  2. /tmp 缓存目录

在普通用户下 $USER 表示用户名

  1. /home/$USER 表示用户目录。

  2. $HOME 也表示用户目录

#-------------------------------------------------------

先了解一下就可以,普通用户下临时提权 root 权限。

sudo su 或者 sudo -i 命令行提示符有 $ 变成 #

#-------------------------------------------------------

什么是文本文件,要如何创建 {#%E4%BB%80%E4%B9%88%E6%98%AF%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%8C%E8%A6%81%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA}

1.文本编辑器可以直接编辑的,比如 .txt .sh .js .html ,SHELL脚本的后缀名是.sh

2.右键桌面就可以直接创建文本文件

3.创建文本文件有一个专有命令 touch

[touch] {#%5Btouch%5D}

在桌面创建文本文件

touch /home/$USER/桌面/123.txt

在 /opt 创建文本文件,因为普通用户不能直接操作 /opt 所以提权操作sudo

sudo touch /opt/123.txt

[echo] {#%5Becho%5D}

echo 的作用就是打印字符串

在终端输入 echo "123456" 就会显示 123456

echo 也可以用来创建文本文件

在桌面创建123.txt

echo "" > /home/$USER/桌面/123.txt

在桌面创建123.txt 123456保存到123.txt

echo "123456" > /home/$USER/桌面/123.txt

在桌面创建123.txt 123456保存到123.txt

echo "123456" >> /home/$USER/桌面/123.txt

[ > 和 >> ] 的区别 {#%5B-%3E-%E5%92%8C-%3E%3E-%5D-%E7%9A%84%E5%8C%BA%E5%88%AB}


> 清空 {#%3E-%E6%B8%85%E7%A9%BA}

如果桌面有个文本文件 456.txt 里面有 456

>/home/$USER/桌面/456.txt 456.txt 里面有 456就被清空了

echo "123456" > /home/$USER/桌面/456.txt

这个时候原来的数据456就被清空了,并把123456保存在456.txt

>> 追加 {#%3E%3E-%E8%BF%BD%E5%8A%A0}

echo "123456" >> /home/$USER/桌面/456.txt

这个时候原来的数据456会保存,并把123456保存在456.txt,位置就是在保存456的后一行。

总结:在终端创建文本文件 通常有两种方法

1.touch 创建,只能创建空的文本文件

2.echo 创建,可以创建有内容的文本文件

#-------------------------------------------------------

[变量名称]与[变量的直] {#%5B%E5%8F%98%E9%87%8F%E5%90%8D%E7%A7%B0%5D%E4%B8%8E%5B%E5%8F%98%E9%87%8F%E7%9A%84%E7%9B%B4%5D}

变量名称一般使用驼峰命名法 就是单词手写字母大写,比如 LinuxMint="123456"

LinuxMint="123456" LinuxMint是变量名称 123456是LinuxMint直

使用一个变量 ${LinuxMint} 简写 $LinuxMint


注意事项:变量直之间的 单 双 引导的区别 下面使用实例来讲解


LinuxMint="123456"

双引号 {#%E5%8F%8C%E5%BC%95%E5%8F%B7}

echo "${LinuxMint}" 显示 123456

单引号 {#%E5%8D%95%E5%BC%95%E5%8F%B7}

echo '${LinuxMint}' 显示 ${LinuxMint}

显然 双引号是执行了 LinuxMint变量 输出 123456

然而 单引号没有执行 LinuxMint变量 把 ${LinuxMint}当成了字符串输出显示${LinuxMint}

简单讲就 双引号内是可以被执行的,单引号内是不执行的,原来是什么就显示什么


一个变量名字也可被另外一个变量单做直来使用

LinuxMint="123456"

MY_ABC="${LinuxMint}"

echo "${MY_ABC}" 显示 123456

总结:双引号内是可以被执行的。单引号内是不执行的,原来是什么就显示什么。

#-------------------------------------------------------

[cat] {#%5Bcat%5D}

作用:读取文本件,不管是文本文件,还是二进制文件。

比如桌面有个文本文件 ABC.TXT 里面有

cat /home/$USER/桌面/ABC.TXT 显示 456


cat 通常配置 wc grep sed 一起使用

比如 桌面 ABC.TXT 有4行

第一行 123

第二行 456

第三行 789

第四行 456


cat /home/$USER/桌面/ABC.TXT|wc -l

显示数字 4 表示有4行

cat /home/$USER/桌面/ABC.TXT|grep '456' 用来筛查一个文件件中的匹配 456 的所有行

显示包含456的行 这里有两行456 会显示两行456

cat /home/$USER/桌面/ABC.TXT|sed -n 1p

显示第一行 也就 123 ,sed -n 1p中的1p表示第一行 2p表示第二行

cat /home/$USER/桌面/ABC.TXT|grep '456'|sed -n 1p

grep 匹配到 包含 456有两行,sed -n 1p 在显示过来出来的第一行


总结:cat 通常配置 wc grep sed 一起使用

#-------------------------------------------------------

[sed] {#%5Bsed%5D}

sed 的用法很多这里举例一些我使用的

把一个文件中包含特定的所有字符串替换成指定的

比如替换 IP地址 /home/$USER/桌面/ip.txt 有多处IP是一样的 192.168.5.1 替换成 192.168.5.5

sed -i -r "s|192.168.5.1|192.168.5.5|g" /home/$USER/桌面/ip.txt


获得网卡名字

cat /proc/net/dev 显示如下

lo: 86428 726 0 0 0 0 0 0 6428 726 0 0 0 0 0 0

ens32: 36274552 317224 0 0 0 0 0 0 631688016 460301 0 0 0 0 0 0

docker0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


通过 grep 过滤特征字符串 ens enp wl这个是无线网卡 docker

grep 'ens' 特征过滤没有会显示空行

grep 'enp' 特征过滤没有会显示空行

grep 'docker' 特征过滤没有会显示空行

grep 'wl' 特征过滤没有会显示空行


awk '{print $2}' 表示列$2表示第二列,$1表示第1列


cat /proc/net/dev|grep 'ens'|sed 's/^[ ]*//g'|sed 's@:[^ ]*@@g'|sed "s/ .*$//"

我这显示 ens32 这个就是网卡名字,自动配置 .conkyrc 就用得上


ens32: 36274552 317224 0 0 0 0 0 0 631688016 460301 0 0 0 0 0 0

cat /proc/net/dev | grep 'ens'|awk '{print $2}' 最后特征字符串的行,显示第二列 就是36274552

这个用来判断使用的网卡是否有联网


总结:sed 是用来、删减、替换的 {#%E6%80%BB%E7%BB%93%EF%BC%9Ased-%E6%98%AF%E7%94%A8%E6%9D%A5%E3%80%81%E5%88%A0%E5%87%8F%E3%80%81%E6%9B%BF%E6%8D%A2%E7%9A%84}

#-------------------------------------------------------

[grep] {#%5Bgrep%5D}

grep 是查找字符串的命令

ZiFuChuang='123'

FileDir='/opt'

grep -rEn "${ZiFuChuang}" "${FileDir}" | grep -v "Binary file" > $finddir/1.txt

意思就是在/opt目录以及所有的子目录,直到最后一级目录里的文件,去找找包行 123的文件并且显示在哪一行出现

并且把得到的数据保存到 > 清空并保存$finddir/1.txt

注意事项:如果你不确定变量的直是否会被执行你一定要用单引号

#-------------------------------------------------------

[``]单反引号 在英文输出法下按ESC下面那个键

单反引号 必须成对使用 表示里面内容是可以执行的命令

有一个文件 name.log 里面有 3行数据 我想显示你好啊的那一行,已知在第二行

第一行 wewre

第二行 你好啊

第二行 你好啊,你好啊


NAME_A=`cat ./name.log|sed -n 2p`

echo "${NAME_H}"

或者

ABCD_B=`cat ./name.log|grep '你好啊'|sed -n 1p`

echo "${NAME_B}"

#-------------------------------------------------------

[自定义函数] {#%5B%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%5D}

简单理解就是,执行一个函数就执行了函数里面的一大段代码,函数内的东西不影响函数外的东西


ABCD(){

echo '张三'

}

ABCD

上面的ABCD表示执行 然后显示 张三

函数也可以单做变量的直来使用

echo "`ABCD`" >> ./123.txt 打印执行后的行数结果追加到123.txt


ZhangSan="`ABCD`"

echo "${ZhangSan}"

显示 张三


类似的一种写法,一般不建议这种写法,可以用来配合zenity很直观

ZhangSan=$(echo '张三')

echo "${ZhangSan}"

#-------------------------------------------------------

[tee] {#%5Btee%5D}

主要是配合提权使用

这个可以用来修改系统配置文件 resolfconf

如果安装 docker 无法上网

sudo apt-get install resolvconf -y

echo 'nameserver 192.168.5.1' | sudo tee -a /etc/resolvconf/resolv.conf.d/base

echo 'nameserver 114.114.114.114' | sudo tee -a /etc/resolvconf/resolv.conf.d/base

echo 'nameserver 8.8.8.8' | sudo tee -a /etc/resolvconf/resolv.conf.d/base

echo 'nameserver 192.168.5.1' | sudo tee -a /etc/resolvconf/resolv.conf.d/tail

echo 'nameserver 114.114.114.114' | sudo tee -a /etc/resolvconf/resolv.conf.d/tail

echo 'nameserver 8.8.8.8' | sudo tee -a /etc/resolvconf/resolv.conf.d/tail

echo 'TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS=no' | sudo tee -a /etc/default/resolfconf

sudo /etc/init.d/resolvconf restart

sudo resolvconf -u

sudo service networking restart

sudo systemctl enable resolvconf.servi

#-------------------------------------------------------

[sleep] {#%5Bsleep%5D}

卡时间用的命令

sleep 后面加数字 最好是正数不能好似负数

sleep 3 表示等待3秒

在移动文件后使用更好

单纯移动文件

mv /tmp/123 /home/$USER/桌面

移动重命名456

mv /tmp/123 /home/$USER/桌面/456


sleep 1

就是有些命令执行完以后为了保证安全性 需要等待多久时间以后在执行

[其他命令]

cd 进入目录

cd /opt

ls 列出当前目录的文件不包含隐藏文件

ls /bin | grep 'terminal' | sed -n 1p 找出终端名称

ls -a $HOME 显示家目录当前文件或文件夹包括.的隐藏

cp -r 复制文件

cp -r /opt/123.txt /home/$USER/桌面

复制从命名

cp -r /opt/123.txt /home/$USER/桌面/456.txt

mkdir 创建文件夹

套娃创建法最里面一个文件夹是471 推荐 mkdir -p dir 这种

mkdir -p /home/$USER/桌面/456/789/471

chmod -R 750 file 是加权限的

#-------------------------------------------------------

[常用判断逻辑] {#%5B%E5%B8%B8%E7%94%A8%E5%88%A4%E6%96%AD%E9%80%BB%E8%BE%91%5D}

1.两个变量的直是否相等

2.是否存在一个文件

3.是否存在一个文件夹

4.程序或命令执行与否 正常执行返回值 是 0

有一个文件 ABC.TXT 里面有两行

第一行 王五

第二行 李四

判断文件里面有没有张三,没有就写入一个张三

ZhangSan="1"

#肯定要假设存在一行 ZhangSan="1"

NAME=`cat ./ABC.TXT|grep '张三'|wc -l`

#如果没有张三就是0行

if [ ! x${ZhangSan} = x${NAME} ];then

#如果不存在,上面肯定是没有的,所以执行这一段后,判断就结束了。

echo "张三" >> ./ABC.TXT

else

#如果存在

echo ""

exit

fi


判断文件是否存在

if [ ! -f /bin/zenity ];then

#不存在执行这里

sudo apt install -y zenity

else

#存在执行这里

echo "zenity 已安装"

fi


判断文件夹是否存在

if [ ! -d /opt/123 ];then

#不存在执行这里

echo "1"

else

#存在执行这里

echo "2"

fi


程序或命令执行与否 {#%E7%A8%8B%E5%BA%8F%E6%88%96%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E4%B8%8E%E5%90%A6}

判断是否安装了docker 返回值是 0,就代表程序执行成功了 也就是安装了docker

docker -v 2>/dev/null

if [ $? -ne 0 ]; then

#不等于0执行这里

echo '你没有安装docker正在为你安装......'

sudo apt install docker.io

sudo usermod -aG docker $USER

sudo systemctl daemon-reload

sudo systemctl restart docker

else

#等于0执行这里

echo '你已经安装了docker'

fi

#-------------------------------------------------------

[截取字符串]

path=ss/usr/share/src/root/home/admin/src/add

echo $path

echo ${path%src*} #从右向左截取第一个 src 后的字符串

echo ${path}

echo ${path%/*}从右向左截取 第一个 / 后的字符串

echo ${path%%/*}从右向左截取 最后一个 / 后的字符串

echo ${path#*/}从左向右截取第一个 / 后的字符串

echo ${path##*/}从左向右截取最后一个 / 后的字符串

echo ${path:3}

echo ${path:6:60}截取变量path从前三个字符串,表那一行第6个字符到第N个字符,

echo ${#path}计算 path变量 一共有几个字符串

echo ${path/root/kyo}把path变量里的第一个root字符串,替换为 kyo字符串

echo ${path//s/m}把path变量里的所有的s字符,替换为 m 字符

echo ${path}

#-------------------------------------------------------

[把一大段东西保存到文本文件] {#%5B%E6%8A%8A%E4%B8%80%E5%A4%A7%E6%AE%B5%E4%B8%9C%E8%A5%BF%E4%BF%9D%E5%AD%98%E5%88%B0%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%5D}

创建 桌面起动器文件为例

desktop_name='abc'

Name='xxx'

Exec_dir='/opt/123.sh'

Icon_dir='/opt/i8520-SH/i8520Launcher.svg'

cat > /home/$USER/桌面/${desktop_name}.desktop<<EOT

[Desktop Entry]

Name=${Name}

Name[zh_CN]=${Name}

Comment=${Name}

Terminal=false

Type=Application

Categories=Graphics;

StartupNotify=true

Actions=Configure;Capture;

Exec=${Exec_dir}

Icon=${Icon_dir}

EOT

chmod -R 750 /home/$USER/桌面/${desktop_name}.desktop


先讲一下权限问题,在普通用户下是没有root权限。 {#%E5%85%88%E8%AE%B2%E4%B8%80%E4%B8%8B%E6%9D%83%E9%99%90%E9%97%AE%E9%A2%98%EF%BC%8C%E5%9C%A8%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E4%B8%8B%E6%98%AF%E6%B2%A1%E6%9C%89root%E6%9D%83%E9%99%90%E3%80%82}

简单理解就 root权限 具有操作根(系统)目录的全部权限,而普通用户不可以

#-------------------------------------------------------

普通用户可以之直接操作的目录路径有以下

  1. /home/用户名 这个俗称用户目录/家目录,桌面 文档 等文件夹都在这里

  2. /tmp 缓存目录

在普通用户下 $USER 表示用户名

  1. /home/$USER 表示用户目录。

  2. $HOME 也表示用户目录

#-------------------------------------------------------

先了解一下就可以,普通用户下临时提权 root 权限。

sudo su 或者 sudo -i 命令行提示符有 $ 变成 #

#-------------------------------------------------------

什么是文本文件,要如何创建

1.文本编辑器可以直接编辑的,比如 .txt .sh .js .html ,SHELL脚本的后缀名是.sh

2.右键桌面就可以直接创建文本文件

3.创建文本文件有一个专有命令 touch

[touch]

在桌面创建文本文件

touch /home/$USER/桌面/123.txt

在 /opt 创建文本文件,因为普通用户不能直接操作 /opt 所以提权操作sudo

sudo touch /opt/123.txt

[echo]

echo 的作用就是打印字符串

在终端输入 echo "123456" 就会显示 123456

echo 也可以用来创建文本文件

在桌面创建123.txt

echo "" > /home/$USER/桌面/123.txt

在桌面创建123.txt 123456保存到123.txt

echo "123456" > /home/$USER/桌面/123.txt

在桌面创建123.txt 123456保存到123.txt

echo "123456" >> /home/$USER/桌面/123.txt

[ > 和 >> ] 的区别 {#%5B-%3E-%E5%92%8C-%3E%3E-%5D-%E7%9A%84%E5%8C%BA%E5%88%AB-1}


> 清空 如果桌面有个文本文件 456.txt 里面有 456

>/home/$USER/桌面/456.txt 456.txt 里面有 456就被清空了

echo "123456" > /home/$USER/桌面/456.txt

这个时候原来的数据456就被清空了,并把123456保存在456.txt

>> 追加

echo "123456" >> /home/$USER/桌面/456.txt

这个时候原来的数据456会保存,并把123456保存在456.txt,位置就是在保存456的后一行。

总结:在终端创建文本文件 通常有两种方法

1.touch 创建,只能创建空的文本文件

2.echo 创建,可以创建有内容的文本文件

#-------------------------------------------------------

[变量名称]与[变量的直] {#%5B%E5%8F%98%E9%87%8F%E5%90%8D%E7%A7%B0%5D%E4%B8%8E%5B%E5%8F%98%E9%87%8F%E7%9A%84%E7%9B%B4%5D-1}

变量名称一般使用驼峰命名法 就是单词手写字母大写,比如 LinuxMint="123456"

LinuxMint="123456" LinuxMint是变量名称 123456是LinuxMint直

使用一个变量 ${LinuxMint} 简写 $LinuxMint


注意事项:变量直之间的 单 双 引导的区别 下面使用实例来讲解


LinuxMint="123456"

双引号

echo "${LinuxMint}" 显示 123456

单引号

echo '${LinuxMint}' 显示 ${LinuxMint}

显然 双引号是执行了 LinuxMint变量 输出 123456

然而 单引号没有执行 LinuxMint变量 把 ${LinuxMint}当成了字符串输出显示${LinuxMint}

简单讲就 双引号内是可以被执行的,单引号内是不执行的,原来是什么就显示什么


一个变量名字也可被另外一个变量单做直来使用

LinuxMint="123456"

MY_ABC="${LinuxMint}"

echo "${MY_ABC}" 显示 123456

总结:双引号内是可以被执行的。单引号内是不执行的,原来是什么就显示什么。


chmod -R 750 /home/$USER/桌面/${desktop_name}.desktop



赞(0)
未经允许不得转载:工具盒子 » linux 系列教程 shell 简单入门