1

我的问题是我不明白为什么当我运行脚本时,如果我写“是”或“否”,它总是说我正在退出脚本。我知道它不承认$reply和“是”是平等的,但为什么呢?(我是 bash 编程的新手)。谢谢!

#!/bin/bash
clear
echo 'This script will install: Firefox 17.0.1 (language: enGB or itIT or enUS) and flash 11 in Firefox17.0.1, continue?'
read reply
if (( "$reply" = "yes" )); then
  pkill firefox
  rm -rf /tmp/fox
  mkdir /tmp/fox
  cd /tmp/fox
  rm -rf /opt/firefox/*
  rm -rf /usr/lib/mozilla/plugins/*
  rm -f /usr/share/icons/mozicon128.png
  mkdir /usr/lib/mozilla/plugins
  mkdir /opt/firefox
  echo "Enter your language (exmp: it en us)"
  read reply1
  if (( "$reply1" = "it" )); then
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/it-IT/firefox-17.0.1.tar.bz2
  elif (( "$reply1" = "en" )); then
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-GB/firefox-17.0.1.tar.bz2
  else
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/firefox-17.0.1.tar.bz2
  fi
  wget http://fpdownload.macromedia.com/get/flashplayer/pdc/11.2.202.258/install_flash_player_11_linux.x86_64.tar.gz
  wget http://upload.wikimedia.org/wikipedia/commons/7/76/Mozilla_Nightly_icon_2011.png

  tar -xvf firefox-17.0.1.tar.bz2
  tar -xvf install_flash_player_11_linux.x86_64.tar.gz

  cp -R firefox/* /opt/firefox
  cp libflashplayer.so /usr/lib/mozilla/plugins/
  rm -f /opt/firefox/icons/mozicon128.png
  cp -f Mozilla_Nightly_icon_2011.png /opt/firefox/icons/mozicon128.png
  echo "Reboot the system to show the new icon?"
  read response
  if (( "$response" = "yes" )); then
    reboot 
  else
    echo 'Installation Complete'
  fi
else
  echo "I'm quitting the script..."
  exit
fi
4

3 回答 3

6

您正在使用算术表达式块(( ))来比较字符串。混乱将接踵而至。

read -p 'This script will install: Firefox 17.0.1 (language: enGB or itIT or enUS) and flash 11 in Firefox17.0.1, continue?' reply
if [[ "$reply" = "yes" ]]; then
    …
于 2013-01-05T06:34:50.083 回答
3

双括号(( ... )),当与构造一起使用时,根据它们所包含的整数测试表达式if/then的评估返回退出状态。例如,测试将评估为真(即)。((5 == 5))0

独立的双括号允许您使用算术评估,如i=$(( 2+3 )), 和/或 c 风格的语法,如

(( i = 1 )) #or 
(( i++ )) #or 
for ((i=0;i<5;i++)); do ...; done

但是,在您的代码中,当您尝试评估变量比较表达式时,您实际上是在针对 c 样式赋值进行测试。(( "$reply" = "yes" ))既不比较整数也不比较任何其他值,而只是将字符串的数字转换分配给"yes"由内容标识的变量,$reply并将分配的值作为其退出状态返回。

yes转换为0. 如果用户输入yes作为他们的回复,效果将是分配

yes=0

鉴于此,该if语句只是测试一个整数值是否为非零,因此由于括号中的赋值为零,它将返回 a1作为退出代码,这意味着false,并且该then块将不会被执行。除非用户输入一个非零整数值。

将括号更改为双括号[[...]],你会没事的。在这种情况下,如果您更喜欢使用===作为操作员并不重要。

if [[ "$reply" = "yes" ]]; then

需要更多详细信息时,您将在网站上找到有用的答案。

于 2013-01-05T06:42:48.737 回答
0

运行这个脚本,它对我有用,没有错误,让我的 Flash 播放器正常工作。

# Prepare Directory's
pkill firefox
mkdir /tmp/fox
cd /tmp/fox
rm -rf /opt/firefox/*
rm -rf /usr/lib/mozilla/plugins/*
rm -f /usr/share/icons/mozicon128.png
mkdir /usr/lib/mozilla/plugins
mkdir /opt/firefox

# Download Resources
wget http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/firefox-18.0.tar.bz2
wget http://fpdownload.macromedia.com/get/flashplayer/pdc/11.2.202.258/install_flash_player_11_linux.x86_64.tar.gz
wget http://upload.wikimedia.org/wikipedia/commons/7/76/Mozilla_Nightly_icon_2011.png

# Extract Resources
tar -xvf firefox-18.0.tar.bz2
tar -xvf install_flash_player_11_linux.x86_64.tar.gz

# Install
cp -R firefox/* /opt/firefox
cp libflashplayer.so /usr/lib/mozilla/plugins/
#Restart Backtrack to reload start menu icon's or goto menu editor and reselect icon
cp -f Mozilla_Nightly_icon_2011.png /usr/share/icons/mozicon128.png

# Done
echo 'Installation Complete'
于 2013-01-10T03:38:37.410 回答