Linux 与 shell 简单应用

本文介绍Shell脚本的基础知识,包括shell脚本的执行原理、基本语法、变量定义、字符串操作、流程控制结构如if、for、while循环,以及函数定义等。通过实例演示了常见操作如条件判断、循环迭代、文件读写等。

shell 脚本语言简单使用

shell 作为linux 脚本语言,对于我们学习他人程序流程以及方便自身开发都有很大帮助,值得学习。

顶行

#! /bin/bash

#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。

简单使用

hello-world

永远的开始——hello-world,这里echo用来返回。

echo "Hello world \n"

返回参数

echo ${0} # 返回执行文件
echo ${1} # 返回输入的第一个参数
echo ${2} # 返回输入的第二个参数
echo ${3} # .
echo ${4} # .
echo ${5} # .
echo ${*} # 返回所有参数
echo ${#} # 返回参数个数
#执行结果
root@chilewang-Lenovo:~# sh ss.sh 1 2 3 4 5
ss.sh
1
2
3
4
5
1 2 3 4 5
5

引入其他脚本文件

这里可能会报错。

. include.sh
# 或者
source include.sh

定义字符串变量

这里注意变量赋值“=”左右两端不能有空格。基本上shell中赋值都不可加空格。

str=sdfghh

定义只读字符串

readonly str

一些规则

"" # 可以识别变量,但无法存放 $ ` \ "" 可以使用转义符
'' # 不解析字符,所有字符都认为普通字符,不解析变量
\  # 转义

长度计算 ${#变量}

${#str}

子串提取

从字符串第二个字符,提取三个字符

${str:2:3}

数组操作

数组定义及取值

array=(a b c d)
echo ${array[0]}
echo ${array[1]}

字符串的计算

-lt  #小于
-le  #小于等于
-gt : #大于
-ge : #大于等于
-eq : #等于
-nq : #不等于

文件的判断

-f # 普通文件
-d # 目录文件
-w # 文件可写
-x # 文件可执行
-s # 文件至少有一个字符
-c # 字符设备文件——比如鼠标键盘
-b # 块设备文件

测试工具:test

test # 测试工具,成功的值 $? 表现为0,否则为1。

注意判断逻辑仍为正确和错误

[ 表达式 ] # 简写形式:表达式前后需要空格

逻辑判断

-a # 逻辑与,and的简写。
&&
-o # 逻辑或,or简写
||# 逻辑非,

结构书写

if 分支结构

简单判断,其中if 做起手,fi 做结束。

if [ 2 -lt 3 ];then
        echo "2 < 3"
fi
#返回值
2 < 3

if——else:
其中read -p 是读取输入值 最后存入ch

read -p "input a char:" ch
if [ $ch -ge 5 ];then
        echo ">=5"
elif [ $ch -ge 3 ];then
        echo ">=3"
else
        echo "<3"
fi
# 执行结果:
input a char:1
<3

case 分支结构

这里注意判断[]的空格问题,这里没有空格

read -p "input a char:" ch

case $ch in
[a-z])
        echo "alpha"
;;
[0-9])
        echo "number"
;;
*)
        echo "others"
;;
esac
# 输出结果:
root@chilewang-Lenovo:~# sh case.sh 
input a char:a
alpha
root@chilewang-Lenovo:~# sh case.sh 
input a char:3
number

for 循环结构

简单遍历

for x in a b c
do
        echo $x
done
# 执行结果
root@chilewang-Lenovo:~# sh for.sh 
a
b
c

遍历目录

for x in /*
do
        echo $x
done
# 执行结果:
root@chilewang-Lenovo:~# sh for.sh 
/'
/1
/bin
/boot
···

遍历数字:

for x in `seq 0 10`
do
        echo $x
done
# 执行结果:
root@chilewang-Lenovo:~# sh for.sh 
0
1
2
3
4
5
6
7
8
9
10

累加:

for x in `seq 0 10`
do
        let sum+=$x
done
echo $sum
# 结果:
55

for 语句的传统写法:

for ((i=0;i<=10;i++))
do
        echo $i
done

while 循环结构

i=1
while [ $i -le 10 ]
do
        echo $i
		i=$[$i+1]
        #((i++))
        # 或用
        # let i+=1
        
done

until 循环结构

i=1
until [ $i -gt 10 ]
do
        echo $i
        ((i++))
done
# 执行结果:
1
2
3
4
5
6
7
8
9
10

break 循环结构

这里注意 while与 : 之间的空格。
这里的冒号命令 相当于true,放在while后面,表示无限循环

while :
do
        read -p "input a char:" ch
        case $ch in
        #1|3|5)  # 这里可以间断的判断值的取值
        [1-5])   # 这里连续判断取值
                echo "ok"
        ;;
        *)
                echo "error"
                break
        ;;
        esac
done
# 执行结果:
input a char:1
ok
input a char:6
error

continue 循环结构

在 [] 内运算之后的值进行判断时,需要使用$[] 对其取值再做判断。
同时注意if语句的 fi 结束符号。

i=1
while [ $i -le 10 ]
do
        if [ $[$i%3] -eq 0 ];then
                ((i++))
                continue
        fi
        echo $i
        ((i++))
done
# 执行结果:
1
2
4
5
7
8
10

函数书写

hello world

demo()
{
        echo "hello world"
}
demo
# 执行结果:
hello world

回调参数

test()
{
        echo $1
        echo $2

}
test 123 abc
# 执行结果:
123
abc

函数返回值与接收

add()
{
        return 123
}
add
echo $?
# 执行结果:
123

逻辑运算

判断与

如果2小于3 且 3小于5,输出。

if [ 2 -lt 3 -a 3 -lt 5 ];then
# 还可以这样写
# if [ 2 -lt 3 ] && [ 3 -lt 5 ];then
        echo "ok!"
fi
# 输出结果:
ok!

判断或

if [ 2 -gt 3 -o 3 -lt 5 ];then
# if [ 2 -gt 3 ] || [ 3 -lt 5 ];then
        echo "ok!"
fi
# 输出结果:
ok!

取反

if [ ! 2 -gt 3 ];then
        echo "ok!"
fi
# 执行结果:
ok!

黑洞文件

该文件如何写入都是空,任意时间读取都是空。

用于清空文件,该文件在/dev/null。
将黑洞文件重定向到1.txt,即可清空文件。

cat /dev/null > 1.txt

还可以清空命令

cat /dev/null > 

printf与字符串的拼接

printf "hello %s\n" "world"
printf "hello %d %s \n" 123 "world"
# 输出结果:
hello world
hello 123 world

sed 文件流处理

作用:处理文件流
格式:sed [参数] 指令 文件
参数:
-n:结合命令p使用,用于打印(并没有改变内容)。
-i:默认不加 改 参数不会修改文件内容,加上会修改

用于查找

# 打印sed.sh文件第一行
sed -n '1p' sed.sh
# 打印第三行
sed -n '3p' sed.sh
# 打印最后一行
sed -n '$p' sed.sh
# 打印某个范围
sed -n '3,5p' sed.sh
sed -n '3,$p' sed.sh

用于添加

注意:没有添加 -i 参数,仍然未修改文件内容。

# 在第一行后面添加xxx
sed '1a xxx' sed.sh 

# 在第1到第三行后面添加xxx
sed '1,3a xxx' sed.sh 

用于删除

# 删除第五行
sed '5d' sed.sh 
# 删除第一到5行
sed '1,5d' sed.sh 

用于取代

# 取代第三行
sed '3c xxx' sed.sh 
# 取代第三到五行
sed '3,5c xxx' sed.sh

用于替换

# s 用于替换,查找ia,并用xxx替换,/g全局。
sed 's/ia/xxx/g' sed.sh 
# 在5到6行进行操作。
sed '5,6s/ia/xxx/g' sed.sh 

常用操作

管道(|)

说明:将前一个命令的输出作为后一个命令的输入。

# 作为more的参数输入
ls -l /etc/ | more
# 打印包含 vi 的
ls -l /etc/ | grep vi
# 执行结果:
-rw-r--r--  1 root root        96 9月  30  2019 environment
-rw-r--r--  1 root root     19183 12月 26  2016 services
drwxr-xr-x  2 root root      4096 10月 13  2019 vim

# 打印vi开头的
ls -l /etc/ | grep '^vi'

假如有些命令不接受参数,添加

find -type d | xargs rm -r

重定向 (>)

打开任意程序,系统自动创建三个文件流:标准输入(0),标准输出(1),标准错误(2),而且这三个文件都被指向到了终端。

我们可以使用 > 输出到文件中
输出重定向:

root@chilewang-Lenovo:~# echo 1 > 1.txt
root@chilewang-Lenovo:~# cat 1.txt
1
# 使用>> 进行追加
root@chilewang-Lenovo:~# echo 1 >> 1.txt
root@chilewang-Lenovo:~# cat 1.txt
1
1

错误重定向:
注意这里的 “2>1”不能有空格

root@chilewang-Lenovo:~# ls /abc 2>1.txt
root@chilewang-Lenovo:~# cat 1.txt
ls: 无法访问'/abc': 没有那个文件或目录

将多个输出同时定向到一个文件:

root@chilewang-Lenovo:~# ls /abc . &>1.txt
root@chilewang-Lenovo:~# cat 1.txt 
ls: 无法访问'/abc': 没有那个文件或目录
.:
1
1.sh
1.txt
break.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值