bash 脚本将命令作为参数传递

bash 脚本将命令作为参数传递

选择应基于执行脚本时提交的参数。

#!/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

相关内容