【问题标题】:linux shell script does not capture input paramslinux shell脚本不捕获输入参数
【发布时间】:2021-05-02 02:54:03
【问题描述】:

我在一个文件中有一个 shell 脚本 8185556677(Rasbpian 上的 bash shell):

#!/bin/sh
#setup network interfaces
setup_interfaces()
{
    INTERFACE_0=$1
    SSID_0=$2
    PSK_0=$3
    WIRELESS_POWER_0=$4
    echo "interface:" $INTERFACE_0 "ssid:" $SSID_0 "psk:" $PSK_0 "wireless_power:" $WIRELESS_POWER_0
    sudo cp -r /etc/network/interfaces /etc/network/interfaces.BACKUP
    sudo cp /home/pi/Edge-CommHub/Edge-CommHub/Edge-CommHub/resources/RASPIAN/interfaces.TEMPLATE /etc/network/interfaces
    sudo sed -i 's/<interface_0>/$INTERFACE_0/g' /etc/network/interfaces
    sudo sed -i 's/<interface_0_ssid>/$SSID_0/g' /etc/network/interfaces
    sudo sed -i 's/<interface_0_psk>/$PSK_0/g' /etc/network/interfaces
    sudo sed -i 's/<wireless_power_on_off>/$WIRELESS_POWER_0/g' /etc/network/interfaces
    sudo cp -r /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.confBACKUP
    sudo cp -r /home/pi/Edge-CommHub/Edge-CommHub/Edge-CommHub/resources/RASPIAN/wpa_supplicant.confTEMPLATE /etc/wpa_supplicant/wpa_supplicant.conf
    sudo sed -i 's/<interface_0_ssid>/$SSID_0/g' /etc/wpa_supplicant/wpa_supplicant.conf
    sudo sed -i 's/<interface_0_psk>/$PSK_0/g' /etc/wpa_supplicant/wpa_supplicant.conf
}

setup_interfaces

我用输入参数调用脚本:

./setup.sh &lt;param1&gt; &lt;param2&gt; &lt;param3&gt; &lt;param4&gt;

例如./setup.sh wlan0 Wifi_2.G 8185556677 off

然而,这些值并没有被传递给 shell 脚本,输出是:

interface: ssid: psk: wireless_power:

而不是:

interface: wlan0 ssid: Wifi_2.G psk: 8185556677 wireless_power: off

为什么我的命令行参数没有到达脚本?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    它们正在被传递给脚本,如果您将echo "$1" 放在该行之前,您可以看到:

    setup_interfaces
    

    他们没有被传递的地方是从那行到你的函数。在函数中,$1..n 函数的参数, 而不是程序。

    第一次调用是下面的 sn-p 基本上是你正在做的,第二次调用将脚本参数转发给函数:

    #!/usr/bin/env bash
    
    myfunc() {
        for arg in "$@" ; do
            echo "   ${arg}"
        done
    }
    
    echo "No args:"
    myfunc
    echo "With args:"
    myfunc "$@"
    

    输出显示在以下脚本中:

    pax> ./prog.sh a b c "d e f"
    No args:
    With args:
       a
       b
       c
       d e f
    

    在您的情况下,解决方案就像调用函数一样简单:

    setup_interfaces "$1" "$2" "$3" "$4"
    

    可能也希望在您的函数中正确使用变量:

    INTERFACE_0="$1"
    SSID_0="$2"
    PSK_0="$3"
    WIRELESS_POWER_0="$4"
    echo "interface: $INTERFACE_0 ssid: $SSID_0 psk: $PSK_0 wireless_power: $WIRELESS_POWER_0"
    

    并意识到,在' 单引号内,变量扩展未完成,因此您可能希望在sed 命令上使用" 双引号,例如:

    sudo sed -i "s/<interface_0>/$INTERFACE_0/g" /etc/network/interfaces
    

    【讨论】:

    • 不要使用$*,而是使用"$@"(包括引号!)。 $* 不会正确处理带空格的参数:myfunc a b "c d"
    • @Leonardo,因此我的评论“有更好的方法......”。当函数中的 OP 代码已经假定没有空格时,几乎不需要以正确的方式进行操作。但我会更新答案以考虑您的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-11-16
    • 2012-04-15
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多