shell

  1. 变量、命令之间关系

tiny@tiny:~$ var=`which uname`
tiny@tiny:~$ ${var}
Linux

tiny@tiny:~$ ${var}

Linux
tiny@tiny:~$ echo $var
/bin/uname

tiny@tiny:~$ var=$(`which uname`)

tiny@tiny:~$ echo $var

Linux
tiny@tiny:~$ ${var}
Linux:未找到命令

  • 针对不同的变量状态赋值(没设定、空值、非空值):
${file-my.file.txt}: 若$file没有设定,则使用my.file.txt作返回值。(空值及非空值时不作处理)
${file:-my.file.txt}:若$file没有设定或为空值,则使用my.file.txt作返回值。(非空值时不作处理)
${file+my.file.txt}: 若$file设为空值或非空值,均使用my.file.txt作返回值。(没设定时不作处理)
${file:+my.file.txt}:若$file为非空值,则使用my.file.txt作返回值。(没设定及空值时不作处理)
${file=my.file.txt}: 若$file没设定,则使用my.file.txt作返回值,同时将$file 赋值为 my.file.txt。(空值及非空值时不作处理)
${file:=my.file.txt}:若$file没设定或为空值,则使用my.file.txt作返回值,同时将 $file 赋值为 my.file.txt。(非空值时不作处理)
${file?my.file.txt}: 若$file没设定,则将my.file.txt输出至 STDERR。(空值及非空值时不作处理)
${file:?my.file.txt}:若$file没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)
注意: 
":+"的情况是不包含空值的.
":-", ":="等只要有号就是包含空值(null).
  • 截断功能
${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:    拿掉最后一条/及其左边的字符串:my.file.txt
${file#*.}:       拿掉第一个.及其左边的字符串:file.txt
${file##*.}:    拿掉最后一个.及其左边的字符串:txt
${file%/*}:     拿掉最后条/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}: 拿掉第一条/及其右边的字符串:(空值)
${file%.*}:    拿掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}: 拿掉第一个.及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
[list]#是去掉左边, ##最后一个
      %是去掉右边, %%第一个
  • exp:
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
  • 字符串提取
单一符号是最小匹配﹔两个符号是最大匹配。
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
  • 字符串替换
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
  • 数组运算
${#file} :变量长度
A=(a b c def)
${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)

https://www.cnblogs.com/cornerxin/p/9105612.html

  1. 重定向
  • 命令cmd将stderr单独定向到一个文件,将stdout重定向到另一个文件:
cmd 2>stderr.txt 1>stdout.txt
cmd> output.txt 2>&1
cmd &> output.txt
cmd >& output.txt
  1. 删除当量文件
find audio1 -type f -name "*.wav" | xargs rm -f -v
  1. 判断变量是否为空
    在这里插入图片描述

如上图所示,变量值非空时返回真(即返回值为0),使用上述方法判断变量值是否为空时,[ ] 与 [[ ]] 没有区别,上例中,变量值非空,返回真,我们可以使用"!"进行取反,使得变量值为空时,返回真,示例如下:

在这里插入图片描述

上述示例中,[ ] 与 [[ ]] 没有区别。

我们知道,在Linux中,我们可以使用test命令判断一个字符串是否为空,test命令为我们提供了"-z选项"与"-n选项",使用这两个选项可以判断字符串是否为空。"-z选项"可以判断指定的字符串是否为空,为空则返回真,非空则返回假,-z可以理解为zero,"-n选项"可以判断指定的字符串是否为空,非空则返回真,为空则返回假,-n可以理解为nozero,示例如下:

在这里插入图片描述

正如上图所示,我们通过test命令判断了字符串是否为空,那么我们来尝试一下,使用test命令判断变量的值是否为空,示例如下:

在这里插入图片描述

上例中,变量b的值为空,按照正常的逻辑来说,使用test -n 命令判断变量b的值是否为空时,应该返回假,因为test命令的-n选项表示指定的字符串非空时,返回真,为空时,返回假,但是上例中,‘test -n $b’ 这条命令的返回值却为真(应该为假),这是明显不正确的,所以,为了防止上述情况的发生,在使用test命令的-n选项判断变量的值是否为空时,需要在变量的外侧加上"双引号",示例如下:

在这里插入图片描述

在Linux中,"[ ]"与"test命令"是等效的,比如,我们也可以使用"-n"或者"-z"结合"[ ]"去判断变量是否为空

在这里插入图片描述

根据上例中的结果可以看出,当"[ ]“中使用”-n"或者"-z"这些选项判断变量是否为空时,必须在变量的外侧加上双引号,才更加保险,与"test命令"的使用方法相同。不过,使用"[[ ]]"时则不用考虑这样的问题,示例如下:

在这里插入图片描述

  1. 组合判断条件

在shell中,我们可以使用"-a"或者"-o"对多个条件进行连接,然后进行"与运算"或者"或运算",也可以使用"&&“或者”||“对多个条件进行连接,但是,这两种方法对于”[ ]“或者”[[ ]]"来说,是存在区别的:

在这里插入图片描述

如上图所示,当使用"[[ ]]“对多个条件进行"与运算"或者"或运算"时,可以一次性将多个条件都包含在一个”[[ ]]“中,然后将每个条件用”&&“或者用”||“连接起来,或者每个条件分别包含在一个”[[ ]]“中,然后再用”&&“或者用”||“连接起来,正如上图所示,这两种写法都是没有问题的。那么,使用”[[ ]]“时,能否使用”-a"或者"-o"对多个条件进行连接呢?我们来实验一下,示例如下:

在这里插入图片描述

使用"[[ ]]“时,是不能使用”-a"或者"-o"对多个条件进行连接的。我们将"[[ ]]“换成”[ ]"试试:

在这里插入图片描述

当使用"[ ]“时,如果使用”-a"或者"-o"对多个条件进行连接,"-a"或者"-o"必须被包含在"[ ]“之内,才能够正常使用,否则会报语法错误。”-a"或者"-o"的使用方法我们已经在"[ ]“中进行了验证,现在,我们来试试”&&“或者”||“在”[ ]"中的使用方法,示例如下:

在这里插入图片描述

从上例中可以看出,与"-a"或者"-o"的使用方法正好相反,当使用"[ ]“时,如果使用”&&“或者”||“对多个条件进行连接,”&&“或者”||“必须在”[ ]"之外,否则会报语法错误。

  1. 某些运算符

如果想要判断变量的值是否满足某个正则表达式,我们可以使用符号"=~"进行判断,示例如下:

在这里插入图片描述

如上图所示,我们通过"=~",可以判断一个变量的值是否匹配对应的正则表达式,但是细心如你一定发现了,上例中使用了"[[ ]]",如果把"[[ ]]“替换成”[ ]",能否同样正常运转呢?我们来试试。

在这里插入图片描述

看来是不能这样使用的,所以我们可以得出结论,"=~“只能应用于”[[ ]]“中,不能应用于”[ ]“中。
同样,有些其他符号对于”[[ ]]“或者”[ ]“来说,在使用时也是有区别的,比如”>“或者”<",在之前的文章中,其实已经描述了在使用">“或者”<“时,”[[ ]]“与”[ ]"的区别.

在shell中,"-gt"或者"-lt"只能用于比较两个数字的大小,当我们想要比较两个字符的ASCII值时,则必须使用">“或者”<",而且需要注意,当使用"双中括号"进行判断时,">“或者”<“不用转义即可正常使用,当使用"单中括号"进行判断时,”>“或者”<"需要转义后才能正常使用。

当使用"-n"或者"-z"这种方式判断变量是否为空时,"[ ]“与”[[ ]]“是有区别的。
使用”[ ]“时需要在变量的外侧加上双引号,与test命令的用法完全相同,使用”[[ ]]"时则不用。

在使用"[[ ]]“时,不能使用”-a"或者"-o"对多个条件进行连接。
在使用"[ ]“时,如果使用”-a"或者"-o"对多个条件进行连接,"-a"或者"-o"必须被包含在"[ ]“之内。
在使用”[ ]“时,如果使用”&&“或者”||“对多个条件进行连接,”&&“或者”||“必须在”[ ]"之外。

在使用符号"=~“去匹配正则表达式时,只能使用”[[ ]]",当使用">“或者”<“判断字符串的ASCII值大小时,如果结合”[ ]“使用,则必须对”>“或者”<"进行转义.

  1. 变量赋值
  • https://blog.csdn.net/Michaelwubo/article/details/81698307
"${1^^}_DOC_CHANGE_PID"  #变量转换为大写
"${1,,}_DOC_CHANGE_PID"  #变量转换为小写
${!DOC_CHANGE_PID} #取变量的值

  1. example.sh
#!/usr/bin/env bash
case $1 in
--config)
    echo "${2:-}"
    if [ -z "${2:-}" ]
    then
        echo "zzz"
    fi
    ;;
*)
    echo "123"
esac

终端输入bash example.sh --config ss

ss

终端输入bash example.sh --config

空行
zzz

  1. sed

echo “aaa.wav” | sed -e “s/\.[^\.]*$//g”
aaa

  1. read
find . -follow -name "*.wav" | sort | while read -r filename; do
    id=$(basename "${filename}" | sed -e "s/\.[^\.]*$//g")
    echo "${id} ${filename}" >> "${scp}"
done  
  1. eval
#!/usr/bin/env bash
set -x
while true; do
  [ -z "${1:-}" ] && break;  # break if there are no arguments
  case "$1" in
    # If the enclosing script is called with --help option, print the help
    # message and exit.  Scripts should put help messages in $help_message
    --help|-h) if [ -z "$help_message" ]; then echo "No help found." 1>&2;
      else printf "$help_message\n" 1>&2 ; fi;
      exit 0 ;;
    --*=*) echo "$0: options to scripts must be of the form --name value, got '$1'"
      exit 1 ;;
    # If the first command-line argument begins with "--" (e.g. --foo-bar),
    # then work out the variable name as $name, which will equal "foo_bar".
    --*) name=`echo "$1" | sed s/^--// | sed s/-/_/g`;
      # Next we test whether the variable in question is undefned-- if so it's
      # an invalid option and we die.  Note: $0 evaluates to the name of the
      # enclosing script.
      # The test [ -z ${foo_bar+xxx} ] will return true if the variable foo_bar
      # is undefined.  We then have to wrap this test inside "eval" because
      # foo_bar is itself inside a variable ($name).
      eval '[ -z "${'$name'+xxx}" ]' && echo "$0: invalid option $1" 1>&2 && exit 1;

      oldval="`eval echo \\$$name`";
      exit 0
      # Work out whether we seem to be expecting a Boolean argument.
      if [ "$oldval" == "true" ] || [ "$oldval" == "false" ]; then
        was_bool=true;
      else
        was_bool=false;
      fi

      # Set the variable to the right value-- the escaped quotes make it work if
      # the option had spaces, like --cmd "queue.pl -sync y"
      eval $name=\"$2\";

      # Check that Boolean-valued arguments are really Boolean.
      if $was_bool && [[ "$2" != "true" && "$2" != "false" ]]; then
        echo "$0: expected \"true\" or \"false\": $1 $2" 1>&2
        exit 1;
      fi
      shift 2;
      ;;
  *) break;
  esac
done

bash a.sh --*

+ true
+ '[' -z '--*' ']'
+ case "$1" in
++ echo '--*'
++ sed 's/^--//'
++ sed s/-/_/g
+ name='*'
+ eval '[ -z "${*+xxx}" ]'
++ '[' -z xxx ']'
++ eval echo '$*'
+++ echo '--*'
+ oldval='--*'
+ exit 0
  1. find
find ./aishell_split/0/ppg/ -name "*" -type f -size 0c
  1. rsync
rsync -avzu --progress mooz@192.168.7.49:/storage1t/* .
  1. ls
ls wavs/*.wav | tail -n+10 > train_files.txt
ls wavs/*.wav | head -n10 > test_files.txt
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值