私のコンピュータアーキテクチャを表示するダイアログボックスを持つプログラムを作成したいと思います。しかし、間違った出力があります。これは私のスクリプトです。
#!/bin/bash
# ComputerArchitecture_interactive_dialog: an interactive dialog to see the ComputerArchitecture in a simple way.
DIALOG_CANCEL=1
DIALOG_ESC=255
HEIGHT=0
WIDTH=0
display_result() {
dialog --title "$1" \
--no-collapse \
--msgbox "$result" 0 0
}
while true; do
exec 3>&1
selection=$(dialog \
--backtitle "Computer Architecture list" \
--title "ComputerArchitectuur" \
--clear \
--cancel-label "Exit" \
--menu "Use [ENTER] to select:" $HEIGHT $WIDTH 4 \
"1" "Information about Processors and Cores" \
"2" "Information about RAM-memory" \
"3" "Information about connected drives and USB-devices" \
"4" "Inforamtion about the current load" \
2>&1 1>&3)
exit_status=$?
exec 3>&-
case $exit_status in
$DIALOG_CANCEL)
clear
echo "Program stopped."
exit
;;
$DIALOG_ESC)
clear
echo "Program closed." >&2
exit 1
;;
esac
case $selection in
0 )
clear
echo "Program stopped."
;;
1 )
result=$(echo "Processors and Cores"; lscpu)
display_result "Processors and Cores"
;;
2 )
result=$(echo "RAM"; dmicode --type 17)
display_result "RAM"
;;
3 )
result=$(echo "Connected drives and USB-devices";lsblk \lsusb)
display_result "Connected drives and USB-devices"
;;
4 )
result=$(echo "Current load"; top)
display_result "Current load"
;;
esac
done
これは無効な出力です。
Error: Expected 2 arguments, found only 1.
Use --help to list options.
ベストアンサー1
プロセス置換を二重引用符で囲む必要があります。それらすべて。また、変数(すべての変数 - $ selection、$ HEIGHT、$ WIDTH、$ DIALOG_CANCEL、$ DIALOG_ESCなどの変数)を使用するときは、二重引用符を使用する必要があります。
たとえば、次のようにしないでください。
result=$(echo "Processors and Cores"; lscpu)
これを行う:
result="$(echo "Processors and Cores"; lscpu)"
そしてこれをしないでください:
case $selection in
これを行う:
case "$selection" in
より良い方法は、display_result
グローバル変数()に依存しないように関数を書き換えることです$result
。
たとえば、
display_result() {
# This version of display_result takes multiple args.
# The first is the title. The rest are displayed in the
# message box, with a newline between each arg.
# To insert a blank line use an empty string '' between any two args.
title="$1" ; shift
dialog --title "$title" \
--no-collapse \
--msgbox "$(printf "%s\n" "$@")" 0 0
}
次に、ケースの説明で次のように使用します。
...
case "$selection" in
1) display_result 'Processors and Cores' "$(lscpu)" ;;
2) display_result 'RAM' "$(dmicode --type 17)" ;;
...
esac