选择应基于执行脚本时提交的参数。
#!/bin/bash
#This script echoes a text and creates a file
echo "welcome. Will create a file with content in this folder"
ls -l | grep .txt > files_in_folder
答案1
假设脚本的用户使用的参数是他们想要选择文件名的文件名后缀,例如.txt
.
#!/bin/sh
printf '%s\n' ./*"$1"
这将列出当前目录中以给定文件名后缀结尾的所有名称。该printf
命令将在 shell 扩展模式(包括用户在末尾给出的参数)时生成列表,然后根据格式printf
字符串在其自己的行上输出每个列表条目(在本例中为文件名)。这里使用的格式字符串是%s\n
,这意味着“某个字符串后跟一个换行符”。
您是否想使用ls -l
获取包含文件元数据的“长列表”:
#!/bin/sh
ls -ld ./*"$1"
需-d
要这样做是为了不列出与模式匹配的目录的内容。同样,shell 扩展给定的模式并ls -ld
使用匹配文件名列表进行调用。
要在子目录中包含名称,请使用bash
:
#!/bin/bash
shopt -s globstar
printf '%s\n' ./**/*"$1"
**
如果使用该选项启用了该模式,则该模式会递归地匹配到子目录中globstar
。显然,您也可以使用ls -ld
上面的模式,但是如果模式的扩展导致它有可能被破坏数千文件名。
将列表限制为仅常规文件(即不是目录名称等,但包括隐藏名称),同时进入子目录:
#!/bin/sh
find . -name "*$1" -type f
-ls
如果您需要类似于输出的内容,请添加到末尾ls -ld
。
即使有数千个匹配的文件名,这也可以工作,但现在参数不能再包含文件名通配符(即,.*
如果您将'.*'
参数指定为剧本)。
在所有情况下,都$1
应该引用。在find
命令中,*
也需要被引用,find
它自己的模式匹配也需要被引用-name
。在其他情况下,*
应该不加引号以允许 shell 扩展它。
将输出重定向到文件,无论是在脚本内还是在运行脚本时(如果这是要求的一部分)。
上述脚本的每一种变体都将以相同的方式调用:
./myscript.sh .txt
答案2
您可以像下面这样使用它:(注意传递给脚本的参数中的所有双引号)
#!/usr/bin/bash
first_cmd="$1"
second_cmd="$2"
$first_cmd | $second_cmd > outputfile.txt
执行 :
$ ./temp.sh "ls -lrt" "grep '\.txt$'"
检查输出:
$ cat outputfile.txt
***all the filename with .txt will print