我正在学习使用bash中的功能。我有第一个函数read_file(),它读取/ etc / file并将':'替换为单词之间的空格(例如root:x:0:0:root ...变为root x 0 0 root ...)。然后,我希望能够处理每一行中单个单词的输出。 我的第二个函数display__user_shell()按照/ etc / file中的内容为每个相应的用户打印shell。
我的问题是弄清楚如何调用第一个函数read_file()并在display__user_shell函数中使用其变量。
使用单行输入而不是从文件读取时,我已经能够执行上述操作。 我刚刚从display__user_shell()函数调用了new_data-即$ new_data
read_file() {
read -p "Enter file" file
while read line
do
newlin=$(echo $line | tr ":" " ")
echo newlin
done
}
oldIFS=$IFS
IFS=" "
ct=0
display__user_shell() {
readfile
for item in $newlin;
do
[ $ct -eq 0 ] && name="$item";
[ $ct -eq 6 ] && name="$item";
done
echo "$user's shell is $shell"
}
IFS=$oldIFS
display__user_shell
输出的第一行应该是。
root的shell是/ bin / bash
答案 0 :(得分:1)
与实现无关,这里有一个有趣的问题:如何在另一个函数中引用一个函数的变量。简短的答案是您可以:
$ a() { aye=bee; }
$ b() { echo "$aye"; }
$ a
$ b
bee
但这是一个非常糟糕的主意-Bash具有与Java,Python或Ruby等较安全的语言不同的“不幸”作用域规则,并且这样的代码很难遵循。相反,您可以使用几种模式来生成更具可读性的代码:
打印内部函数中的值,并将其分配给外部函数中的值:
a() {
echo 'bee'
}
b() {
aye="$(a)"
echo "$aye"
}
b # Prints "bee"
在外部范围中调用第一个函数并将其分配给变量,然后在第二个函数中使用它:
a() {
echo 'bee'
}
aye="$(a)"
b() {
echo "$aye"
}
b # Prints "bee"
将第一个和第二个函数作为管道处理,将第一个函数的标准输出传递给第二个函数的标准输入(read
是处理大文件的缓慢方法,但是它以此为例):
a() {
echo 'bee'
}
b() {
while read -r line
do
echo "$line"
done
}
a | b # Prints "bee"
选择哪种选项取决于诸如a
返回的内容以及a
是否产生大量输出之类的其他事情。