我记不住的那些shell知识点

背景:一些我记不住的shell的知识点,作为备忘记录在这里。

1. bash中变量赋值的语法是foo=bar,不能有任何空格分隔。

2. bash中访问变量中存储的数据,其语法为$foo

3. bash中单引号和双引号不同,单引号以'定义的字符串为原义字符串,其中的变量不会被转义,而 双引号"定义的字符串会将变量值进行替换

// 在命令行中进行输入
foo=bar
echo "$foo"
# 打印 bar
echo '$foo'
# 打印 $foo

4. 下列是shell参数中的特殊的变量,同时shell脚本中以变量的形式获取一个命令的输出,即 $(cmd),cmd的输出结果会替换掉$(cmd)

  • $0 - 脚本名
  • $1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。
  • $@ - 所有参数
  • $# - 参数个数
  • $? - 前一个命令的返回值
  • $$ - 当前脚本的进程识别码
  • !! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !!再尝试一次,例如:安装一个程序包,apt install some-software提示没有权限,使用 sudo !!重新执行。
  • $_ - 上一条命令的最后一个参数。如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值

脚本如下:

#!/bin/bash

echo "Starting program at $(date)" # date会被替换成日期和时间

echo "Running program $0 with $# arguments with pid $$"

for file in "$@"; do
    grep foobar "$file" > /dev/null 2> /dev/null
    # 如果模式没有找到,则grep退出状态为 1
    # 我们将标准输出流和标准错误流重定向到Null,因为我们并不关心这些信息
    if [[ $? -ne 0 ]]; then
        echo "File $file does not have any foobar, adding one"
        echo "# foobar" >> "$file"
    fi
done

可以

ls > files_to_search        // 把当前目录的所有文件放到files_to_search文件中

cat files_to_search | xargs ./search   // cat 文件为标准输出通过| 转为标准输入,再通过xargs转换为参数即可。

也可以

./search aFile bFile cFile

6. 还有一个冷门的类似特性是 进程替换process substitution)。 

 <( CMD ) 会执行 CMD 并将结果输出到一个临时文件中,并将 <( CMD ) 替换成临时文件名。这在我们希望返回值通过文件而不是STDIN传递时很有用。例如, diff <(ls foo) <(ls bar) 会显示文件夹 foo 和 bar 中文件的区别。

7. 通配符和{}

使用 ? 来匹配一个字符, 使用 * 来匹配任意个字符

差异在于:对于文件foofoo1foo2foo10 和 barrm foo?这条命令会删除foo1 和 foo2 ,而rm foo* 则会删除除了bar之外的所有文件。

convert image.{png,jpg}
# 会展开为
convert image.png image.jpg

cp /path/to/project/{foo,bar,baz}.sh /newpath
# 会展开为
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath


# 也可以结合通配使用
# 会移动所有 *.py 和 *.sh 文件到folder文件夹下
mv *{.py,.sh} folder

8. shell脚本中,首行一般是#!因为脚本的开头第一行的 shebang,何为shebang?在Unix术语中,井号通常称为sharphashmesh;而叹号则常常称为bang。

在文件中存在Shebang的情况下,类UNIX操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。

9. 合并多个命令的输出到一个文件中

这种称为子命令组,这个小括号将三个命令括起来,作为整体进行输出

在命令行中输入下面命令:

(ls -l; pwd; echo "Hello World!")

将会输出这三个命令的合集

增加重定向符号,将三个命令的输出写到一个文件中

(ls -l; pwd; echo "Hello World!") > /tmp/test.txt

这个 小括号是必须存在的,否则只会写入Hello World

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Penguinbupt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值