linux shell脚本不捕获输入参数

linux shell脚本不捕获输入参数,linux,bash,Linux,Bash,我在一个文件中有一个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 &

我在一个文件中有一个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
而不是:

interface: wlan0 ssid: Wifi_2.G psk: 8185556677 wireless_power: off
为什么我的命令行参数没有到达脚本?

它们正在被传递到脚本,如果将
echo“$1”
放在紧靠行的前面,您会看到:

setup\u接口
它们没有被传递的地方是从那一行传递到你的函数。在函数中,
$1..n
是函数的参数,而不是程序的参数

第一个调用是下面的代码段,基本上就是您正在做的,第二个调用将脚本参数转发给函数:

#/usr/bin/env bash
myfunc(){
对于“$@”中的arg,请执行以下操作
回显“${arg}”
完成
}
回显“无参数:”
myfunc
回显“带参数:”
myfunc“$@”
输出结果显示在以下成绩单中:

pax>/prog.sh a b c“d e f”
无参数:
使用args:
A.
B
C
d e f

在您的情况下,解决方案非常简单,只需使用以下命令调用函数:

setup_接口“$1”“$2”“$3”“$4”

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

INTERFACE_0=“$1”
SSID_0=“$2”
PSK_0=“$3”
无线电源0=“$4”
echo“接口:$interface_0 ssid:$ssid_0 psk:$psk_0无线电源:$wireless_power_0”
并且要意识到,在
单引号中,变量扩展没有完成,因此您可能希望在
sed
命令中使用
双引号,例如:

sudo sed-i“s/$INTERFACE\u 0/g”/etc/network/interfaces
它们正在传递给脚本,如果您将
echo“$1”
放在紧靠行的前面,您可以看到:

setup\u接口
在函数中,
$1..n
是函数的参数,而不是程序的参数

第一个调用是下面的代码段,基本上就是您正在做的,第二个调用将脚本参数转发给函数:

!/usr/bin/env bash
myfunc(){
对于“$@”中的arg,请执行以下操作
回显“${arg}”
完成
}
回显“无参数:”
myfunc
回显“带参数:”
myfunc“$@”
输出结果显示在以下成绩单中:

pax>/prog.sh a b c“d e f”
无参数:
使用args:
A.
B
C
d e f

在您的情况下,解决方案非常简单,只需使用以下命令调用函数:

setup_接口“$1”“$2”“$3”“$4”

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

INTERFACE_0=“$1”
SSID_0=“$2”
PSK_0=“$3”
无线电源0=“$4”
echo“接口:$interface_0 ssid:$ssid_0 psk:$psk_0无线电源:$wireless_power_0”
并且要意识到,在
单引号中,变量扩展没有完成,因此您可能希望在
sed
命令中使用
双引号,例如:

sudo sed-i“s/$INTERFACE\u 0/g”/etc/network/interfaces

不要使用
$*
,而是使用
“$@”
(包括引号!)
$*
无法正确处理带空格的参数:
myfunc a b“c d”
@Leonardo,因此我的评论是“有更好的方法……”。当函数中OP的代码已经假定没有空格时,几乎不需要以正确的方式执行。但我会根据您的评论更新答案。不要使用
$*
,而是使用
“$@”
(包括引号!)
$*
无法正确处理带空格的参数:
myfunc a b“c d”
@Leonardo,因此我的评论是“有更好的方法……”。当函数中OP的代码已经假定没有空格时,几乎不需要以正确的方式执行。但我会根据你的评论更新答案。
interface: wlan0 ssid: Wifi_2.G psk: 8185556677 wireless_power: off