【问题标题】:Pass content from .txt file as argument for bash script?将 .txt 文件中的内容作为 bash 脚本的参数传递?
【发布时间】:2015-05-10 07:48:22
【问题描述】:

我需要“编写一个脚本以将用户添加到您的系统,其中用户的名称作为参数 n(in?,教授拼写错误)提供给脚本格式的文本文件

Last_Name  First_Name  Middle_Initial  Group

(其余说明仅供参考)您的脚本应创建最多 8 个字符的唯一用户名,并生成 用户的随机密码。应为用户分配主目录 取决于他们所在的组。您可以假设用户将属于 管理层(“mgmt”)、员工(“empl”)或临时工(“temp”)以及他们的 相应的目录位于 /home 中的这些组名下。例如,如果 John Doe 是 在“mgmt.”中,他的用户名是 jdoe1234,那么他的主目录应该在 /home/mgmt/jdoe1234.锁定主目录,使其他人没有 对主目录的权限高于用户自己。 您的脚本应该生成一个名为 users.txt 的文件,其中包含以下列:

姓 名 UID 密码

可用于向用户分发用户名和密码。

第一部分(不是斜体)让我感到困惑。如果我正确理解他的措辞,他希望我从单独的 .txt 文件中获取文本并将其用作我的脚本的参数?与

的想法
./file.sh arg1 arg2 arg3 arg4

除了那些 args 将是 .txt 文件中的前四个单词?比如说,如果 .txt 文件包含“Doe John A empl”,那么它就像打字一样

./file.sh arg1 arg2 arg3 arg4

到目前为止,这是我的尝试(我实际上已经尝试过其他的东西,但这是我现在在屏幕上看到的,有点像我一开始的样子):

#!/bin/bash
echo "$(cat file.txt)"
lname=$(echo $1|head -c 3)//to make username use first 3 letters of last name
fname=$(echo $2|head -c 1)//to make username use first letter of first name
mname=$3
group=$4
echo "$lname$fname$mname$group"

截至目前,第一行以下的任何内容都没有任何作用。我从command line arguments from a file content 得到第一行并使用它,因为我认为它可以让我使用 .txt 文件中的内容作为参数,但它显然没有这样做。它只是输出它的内容,而不是让我使用每个单词作为参数。不知道该怎么办。有什么帮助吗?我认为这不会很困难,因为我开始编写脚本时假设用户会提供参数,但我重新阅读了说明的第一部分并假设他希望从单独的 .txt 文件中获取它们。

【问题讨论】:

  • // 不是 shell 中的注释

标签: linux bash


【解决方案1】:

我理解的问题是:

首先:您想将文本文件的内容作为输入/参数传递给shell script

可能还有其他方法,但我建议如下:

./YourScriptFile.sh $(cat YourInputFile.txt)

其次:你想使用它的内容。

我建议在您的脚本文件中使用以下内容:

$1, $3, $4, ..., $n

访问:

1st, 2nd, 3rd, ..., nth

来自输入文件的标记(与新行无关)。

最后:您希望 让用户名使用姓氏的前 3 个字母,或者换句话说,您希望 extract characters from a string

一旦你有了令牌,就很简单了。我建议如下:

FirstTwoChars_of_FirstToken=${1:0:2}
FirstTwoChars_of_SeventhToken=${7:0:2}

或者

LastTwoChars_of_FirstToken=${1:7:9} 
# if the first token is "FirstName" it would return you "me"

希望这能帮助您改进代码。

作为脚注:您的代码将变为:(# 在这里用于 cmets)

#!/bin/bash
lname=$(1:0:3) #to make username use first 3 letters of last name
fname=$(2:0:1) #to make username use first letter of first name
mname=$3
group=$4
echo "$lname$fname$mname$group"

现在你必须执行上面提到的 shell 脚本。

【讨论】:

    【解决方案2】:

    $(command) 返回命令的输出。如果您执行$(cat some_file),它将返回文件的文本。您可以使用它来将文件的内容作为参数提供:

    cmd1 $(cat args_file)
    

    因此,当您使用echo $(cat file.txt) 时,您将获得与使用cat file.txt 相同的输出,因为cat 将文件内容发送到echo,后者将其显示到标准输出。

    $n 表示传递给脚本的参数n$0 是脚本的名称)。在这里,您只需提供一个参数,即文件名。所以$2, $3$4 不会包含任何内容。

    因此,您只能从文件中获取名称为$names=$(cat $1) 的字符串。为了分别获取每个字段,可以使用cut

    lname=$(cut -d \  -f 1 $1)
    fname=$(cut -d \  -f 2 $1)
    mname=$(cut -d \  -f 3 $1)
    group=$(cut -d \  -f 4 $1)
    

    注意事项:

    shell 中 cmets 的符号是 # 而不是 //

    head 显示文件的第一行,head -c 显示第一个字节。它不会剪切文件。

    【讨论】:

    • 感谢您的帮助。我使用了你的“剪辑”形式,它似乎有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2018-07-23
    • 2021-11-25
    • 2017-11-12
    • 2017-05-15
    • 2017-09-26
    • 2019-08-30
    相关资源
    最近更新 更多