Shell Script

Shell Script

赋值操作

foo=bar
echo $foo

注意: 不要使用空格分开

shell 将会把foo当作一个程序

转义

Bash通过使用''""来定义字符串

""会将字符串中的变量转义

echo "String is $foo"

''会将字符串中的变量原样输出

echo 'String is $foo'

函数

函数内容:创建一个目录并进入目录的脚本mcd.sh

mcd(){
	mkdir -p "$1"
	cd "$1"
}

$1等特殊字符参考表

Bash中读取并执行文件中的命令

source mcd.sh

调用mcd函数,创建一个test目录

mcd test

返回码

  • 0:程序成功执行
  • 0:程序有错误

使用$?来查看上条命令返回码

ls #成功执行

cd ooo #假设当前目录下没有ooo这个目录,则有错误发生

true程序返回值始终都是0
false程序返回值始终都是1

逻辑运算符

  • &&:与运算
  • ||:或运算

示例:

ture || echo "OR" # ture的返回值是0,所以不会再执行echo
false || echo "OR" # false的返回值是1,将会继续执行echo

ture && echo "AND" # ture的返回值是0,echo的返回值也是1,所以都会执行
false && echo "AND" # false的返回值是1,echo的返回值是1,将不会执行echo

命令替换

$(CMD)当执行时,shell首先会执行CMD然后使用CMD的结果去替换$(CMD)

示例:

#!/bin/sh 
for i in $(ls); 
do 
	echo $i 
done

这条语句就是ls得到目录里的内容,然后遍历该内容

进程替换

<(CMD)$(CMD)类似,<(CMD)会将CMD执行的的结果输出到一个临时文件中

示例:

diff <(ls d_1) <(ls d_2)

查看两个不同目录的内容,并将其存到临时文件中,使用diff判断目录内容的区别

通配符

符号 含义
* 匹配多个字符
? 匹配单个字符

花括号

在花括号中放入一些字符串,花括号将会展开执行命令

示例:

touch {1,2,3,4,5}

相当于执行了

touch 1
touch 2
touch 3
touch 4
touch 5

如果有多个{},将会按照笛卡尔积去执行
示例:

touch {1,2,3,4,5}-{a,b,c}

相当于执行了

touch 1-a
touch 1-b
touch 1-c
....
touch 5-c

shellcheck

Shellcheck可以用来检查shell脚本错误

课后作业

  1. 题目:
    ls格式化输出:
    • 彩色
    • 指定存储单位
    • 按最后修改时间排序
    • 所有文件
ls --block-size=M --color=always -lt -a

  1. 题目:
    编写两个shell脚本
    1. 每当你执行 marco 时,当前的工作目录应当以某种形式保存
    2. 当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录
#!/bin/bash
marco(){
	$(pwd) > ~/marco.log
}

polo(){
	cd $(cat ~/marco.log)
}
  1. 题目:
    编写一段 bash 脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。
#测试脚本
#!/usr/bin/env bash

n=$(( RANDOM % 100 ))

if [[ n -eq 42 ]]; then
	echo "Something went wrong"
	>&2 echo "The error was using magic numbers"
	exit 1
fi
echo "Everything went according to plan"
#!/bin/bash
count=0
echo > out.log
while true
do
        ./testscript.sh &> out.log
        if [[ $? -ne 0 ]]; then
                cat out.log
                echo "次数:$count"
                break
        fi
        ((count++))
done
  1. 题目:
    您的任务是编写一个命令,它可以递归地查找文件夹中所有的 HTML 文件,并将它们压缩成 zip 文件
find / -name "*.html" | xargs zip html.zip 

xargs
5. 题目:
编写一个命令或脚本递归的查找文件夹中最近使用的文件
按照最近的使用时间列出文件

find . -type f -mmin -60 -print0 | xargs -0 ls -lt |head -10

特殊字符参考表

特殊字符 含义
$0 脚本名
$1~$9 脚本的第一到第九个参数
$@ 所有参数
$# 参数个数
$? 前一个命令的返回值
$$ 脚本的进程码
!! 完整的上一条命令
$_ 上一条命令的最后一个参数
$(CMD) 会首先执行CMD,将执行的内容作为返回值

原文章:http://www.ming-ice-tea.top/?p=28

posted @ 2024-12-22 13:23  明朝冰红茶  阅读(3)  评论(0编辑  收藏  举报