脚本不等于 1 linux,一个shell脚本的解惑

摘要

无意间看到一个shell脚本,很短,但是一行里面就有两个我不知道的地方,特此记录下

#!/bin/bash

path="/home/userA/folder"

find "$path" -maxdepth 1 -type f -name "*.txt" -print0 | while read -d $'\0' file; do

a="$path/$(basename $file)/a_%06.jpg"

echo "$a

done

find 命令里面使用print0 解释:

默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的,大家想过没有如果find结果中有个" "(空格),假如后面接xargs命令(xargs命令又是用空格 TAB 空白字符为界定符的,这时候会出现什么情况?),为了解决此类问题, 聪明的人想出了一个办法, 让 find 在打印出一个文件名之后接着输出一个 NULL 字符 ('\0') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符.

回到上面的脚本 read -d $'\0' 中-d是指定read的界定符,所以这时候这个脚本就能好理解了。

read的一些选项

Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。

-a :将内容读入到数值中

echo -n "Input muliple values into an array:"

read -a array

echo "get ${#array[@]} values in array"

-d :表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。

-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。

-n :用于限定最多可以有多少字符可以作为有效读入。例如echo -n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。

-p :用于给出提示符,在前面的例子中我们使用了echo -n “…“来给出提示符,可以使用read -p ‘… my promt?’value的方式只需一个语句来表示。

-r :在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。

-s :对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,例如read –s key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上 打印,之后如果要求echo,光标会上移。

-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值

2. read的相关实例

a. 拼接文件

#将afile文件中的前三行与bfile中的前四行拼接在一起

while read -u3 i && read -u4 j;do

echo $i $j

done 3

b. 输入不在终端显示

read -p "Input passwd:" -s Passwd

echo $Passwd

c. 限时输入,否则退出

#延迟五秒,没有输入将自动退出

read -p "Input a number:" -t 5 Number

d. 读取限定字符

#从输入中取5个字符

read -p "Input a word:" -n 5 Word

e. 等待输出q退出

#输入,直到输入q,将自动退出

read -dp -p "Input some words end with q:" word

脚本出自

a5a09e3de7bf77790c5a42ed1bba64ee.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值