如何在bash中使用/调用另一个函数中的变量

时间:2019-02-13 04:31:52

标签: bash

我正在学习使用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

1 个答案:

答案 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是否产生大量输出之类的其他事情。