如何打开新终端和 运行 脚本并发送选项
How to open new terminal and run script and sent the option
我有两个脚本,"main.sh" 将打开一个新终端并执行第二个脚本 "test.sh"。
有没有什么方法,如果我 运行 main.sh 它会 运行 test.sh,但我不希望用户按任何项目,我希望它会跳过按项目,然后跳转到按IP地址。我希望我的项目设置为 1,即 ping ip。
main.sh
gnome-terminal -x ./test.sh
test.sh:
echo "1. ping ip "
echo "2. shut down "
echo "3. reboot
echo -n"item:"
read $item
echo -n "Please enter ip address 192.168."
read ipaddress
echo "your ip address is:" $ipaddress
if [ "$status" == "1" ]; then
ip="192.168.0.$ipaddress"
ping -c 1 $ip >"pinglog"
ping_ok=`cat "pinglog"| grep Unreachable`
if [ "$ping_ok" == "" ]; then
echo "BMC ip" $ip "==>ping PASS"
else echo "fail"
else if [ "$status" == "2" ]; then
init 0
else if [ "$status" == "3" ]; then
init 6
else
echo "q"
break
fi
我不确定我是否理解您的需求或您的脚本是否正常工作,但是如果您在脚本的开头有一个您在某些情况下试图跳过的菜单,只需添加一个命令-行参数。由于您的脚本不接受任何命令行参数,因此您可以测试是否存在单个特定参数并采取相应措施。
例如,要测试是否存在 "skipmenu"
字符串作为第一个参数,您可以在脚本开头执行以下操作:
if [ "" = "skipmenu"]; then
# menu must be skipped - set up your variables accordingly here
else
# regular menu
fi
# rest of your code here
以 ./test.sh
执行它会像往常一样调出你的菜单,但以 ./test.sh skipmenu
执行它会跳过它。这样你就可以做到 gnome-terminal -x ./test.sh skipmenu
.
此外,select
语句是在 shell 脚本中制作菜单的好方法。
正确的解决方案是将其模块化为单独的脚本。
将菜单放入menu.sh
:
#!/bin/sh
while true; do
cat <<'____HERE'
1. ping ip
2. shut down
3. reboot
____HERE
read -p "item:" item # no dollar sign on the variable you read!
case $item in
1) exec bmcping;;
2) init 0;;
3) init 6;;
q) break;;
esac
done
(如其他地方所述,使用 select
可以更优雅地完成此操作,但它或多或少会构成相同的代码。)
然后将 ping 功能放入一个单独的脚本中——我在上面的菜单中将其称为 bmcping
。
#!/bin/sh
read -p "Please enter ip address 192.168.0." octet
ip="192.168.0.$octet"
ping -c 1 "$ip" | grep Unreachable &&
echo "BMC ip" $ip "==>ping PASS" || echo "fail"
如 中所述,您最好只检查 ping
的退出状态,而不是查找特定的错误消息;有多个错误(网络无法访问,没有到主机的路由等)可能导致它失败,但所有这些错误都会导致 ping
.
的非零退出代码
如果您将此保存在 /home/you/bin/bmcping
中并且 PATH
中还没有 /home/you/bin
,请将类似的内容添加到您的 .bashrc
或类似内容中:
PATH=$HOME/bin:$PATH
更改将在您启动新的 shell 时生效,或者如果您在 Bash 提示符下执行 . ~/.bashrc
。
现在,您可以从 gnome-terminal
脚本或 运行 循环调用 bmcping
,例如
for ((i=1; i<=20; ++i)); do
echo "$i" | bmcping
done
顺便说一句,这也说明了如何将输入提供给当前脚本,因此只需进行极少的更改,您就可以将当前菜单提供给“1”和一个 IP 地址;但假设您希望脚本以交互方式读取 IP 地址,这将变得相当笨拙。但是,更好的设计是接受 IP 地址作为命令行参数,而不是要求交互式输入。
(我私下里想知道为什么你想 运行 每个都在一个单独的 gnome-terminal
中;更好的方法是启动一些后台进程,并将它们的输出收集到一个日志文件中.)
我有两个脚本,"main.sh" 将打开一个新终端并执行第二个脚本 "test.sh"。
有没有什么方法,如果我 运行 main.sh 它会 运行 test.sh,但我不希望用户按任何项目,我希望它会跳过按项目,然后跳转到按IP地址。我希望我的项目设置为 1,即 ping ip。
main.sh
gnome-terminal -x ./test.sh
test.sh:
echo "1. ping ip "
echo "2. shut down "
echo "3. reboot
echo -n"item:"
read $item
echo -n "Please enter ip address 192.168."
read ipaddress
echo "your ip address is:" $ipaddress
if [ "$status" == "1" ]; then
ip="192.168.0.$ipaddress"
ping -c 1 $ip >"pinglog"
ping_ok=`cat "pinglog"| grep Unreachable`
if [ "$ping_ok" == "" ]; then
echo "BMC ip" $ip "==>ping PASS"
else echo "fail"
else if [ "$status" == "2" ]; then
init 0
else if [ "$status" == "3" ]; then
init 6
else
echo "q"
break
fi
我不确定我是否理解您的需求或您的脚本是否正常工作,但是如果您在脚本的开头有一个您在某些情况下试图跳过的菜单,只需添加一个命令-行参数。由于您的脚本不接受任何命令行参数,因此您可以测试是否存在单个特定参数并采取相应措施。
例如,要测试是否存在 "skipmenu"
字符串作为第一个参数,您可以在脚本开头执行以下操作:
if [ "" = "skipmenu"]; then
# menu must be skipped - set up your variables accordingly here
else
# regular menu
fi
# rest of your code here
以 ./test.sh
执行它会像往常一样调出你的菜单,但以 ./test.sh skipmenu
执行它会跳过它。这样你就可以做到 gnome-terminal -x ./test.sh skipmenu
.
此外,select
语句是在 shell 脚本中制作菜单的好方法。
正确的解决方案是将其模块化为单独的脚本。
将菜单放入menu.sh
:
#!/bin/sh
while true; do
cat <<'____HERE'
1. ping ip
2. shut down
3. reboot
____HERE
read -p "item:" item # no dollar sign on the variable you read!
case $item in
1) exec bmcping;;
2) init 0;;
3) init 6;;
q) break;;
esac
done
(如其他地方所述,使用 select
可以更优雅地完成此操作,但它或多或少会构成相同的代码。)
然后将 ping 功能放入一个单独的脚本中——我在上面的菜单中将其称为 bmcping
。
#!/bin/sh
read -p "Please enter ip address 192.168.0." octet
ip="192.168.0.$octet"
ping -c 1 "$ip" | grep Unreachable &&
echo "BMC ip" $ip "==>ping PASS" || echo "fail"
如 ping
的退出状态,而不是查找特定的错误消息;有多个错误(网络无法访问,没有到主机的路由等)可能导致它失败,但所有这些错误都会导致 ping
.
如果您将此保存在 /home/you/bin/bmcping
中并且 PATH
中还没有 /home/you/bin
,请将类似的内容添加到您的 .bashrc
或类似内容中:
PATH=$HOME/bin:$PATH
更改将在您启动新的 shell 时生效,或者如果您在 Bash 提示符下执行 . ~/.bashrc
。
现在,您可以从 gnome-terminal
脚本或 运行 循环调用 bmcping
,例如
for ((i=1; i<=20; ++i)); do
echo "$i" | bmcping
done
顺便说一句,这也说明了如何将输入提供给当前脚本,因此只需进行极少的更改,您就可以将当前菜单提供给“1”和一个 IP 地址;但假设您希望脚本以交互方式读取 IP 地址,这将变得相当笨拙。但是,更好的设计是接受 IP 地址作为命令行参数,而不是要求交互式输入。
(我私下里想知道为什么你想 运行 每个都在一个单独的 gnome-terminal
中;更好的方法是启动一些后台进程,并将它们的输出收集到一个日志文件中.)