【问题标题】:Shell scripting accepting 2 arguments接受 2 个参数的 Shell 脚本
【发布时间】:2020-03-04 04:58:14
【问题描述】:

我创建了一个名为am.sh 的shell 脚本,它创建文本并将其放入文件中。我现在想创建另一个脚本,它将接受am.sh 创建的文本文件,比如words.txt 和一个数字,所以使用以下命令:

./bm.sh words.txt 5

将输出 words.txt 文件中包含的前 5 个单词。

到目前为止,我所做的所有脚本都只使用一个参数,因此我很困惑。到目前为止,我想出的是:

#!/bin/sh
grep '[A-Za-z]' | while read
do
echo " $a "
done

但我需要一种方法来接受用户想要的字数,然后我需要创建一个将从文本文件输出的循环。

【问题讨论】:

  • 好的,是的,这可能对你有帮助...tecadmin.net/tutorial/bash-scripting/bash-command-arguments
  • 首先,如果你可以使用 bash,那么你的第一行应该是#!/bin/bash。它将提供更多功能。要遍历参数,您可以使用for i in "${@}"; do echo $i; done$i 在每次迭代期间将是要处理的下一个参数。如果引用,您的空格分隔的参数将被保留。例如,如果您的参数是 my "dog has" fleas,那么您有 3 个参数 "my" 然后是 "dog has",最后是 "fleas". You can use "${@:2}"` 以获取以第二个参数 "${@:3}" 开头的所有参数从第三个开始,以此类推。

标签: linux bash shell ubuntu


【解决方案1】:

所以这对我有用:

#!/bin/sh

file=$1
word_count=$2
fields=$(echo $(seq 1 $word_count) | sed 's/\s/,/g')

head -n 1 $file | cut -d ' ' -f$fields

位置参数一 ($1) 必须是您的第一个脚本创建的文件的文件名。第二个($2)是应该打印的字数。

我假设单词由一个空格分隔。

【讨论】:

  • 这不依赖于文件在第一行至少有相关数量的单词吗?
【解决方案2】:

假设am.sh生成的文件每行一个字,那么可以使用:

#!/bin/sh

[ $# = 2 ] || { echo "Usage: $(basename "$0" .sh) file numlines" >&2; exit 1; }

sed "${2}q" "$1"

第一行代码检查是否有两个参数,并指出如何使用该命令,如果没有则以错误状态退出。

第二行使用sed 打印文件的第一行。等效地,您可以使用 head 打印文件的第一行:

head -n "$2" "$1"

如果文件每行包含多个单词,那么您可以使用:

tr -s '[[:space:]]' '\n' < "$1" |
sed "${2}q"

(或head -n "$2")。

请注意,该脚本不会验证 $1 是否为可读文件,也不会验证 $2 是否为大于零的整数。

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2015-09-15
    • 2015-11-26
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2017-06-01
    相关资源
    最近更新 更多