Bash

rm 或 wget 在基於帶有 glob 的變數的腳本中失敗

  • February 11, 2018

我在文件名 globrmwget.

在 Ubuntu 16.04 中,我執行了以下操作:

set -a
export drt="/var/www/html"
export pma="[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]"
set +a
echo $drt # Got the above.
echo $pma # Got the above.

然後我執行了一個可執行腳本(~/myScripts/tp_pma.sh):

#!/bin/bash
rm -rf ${drt}/${pma}*
wget -P ${drt} https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip ${drt}/${pma}*.zip
mv ${drt}/${pma}*/ ${drt}/phpmyadmin/
rm ${drt}/${pma}*.zip

該腳本部分成功:

  1. 第一個rm可能成功或可能導致以下所有問題。
  2. wget部分成功 - 一個帶有新 PMA 副本的 zip 被下載到我的主目錄而不是drt.
  3. 成功了,unzip解壓了 zip,我得到了一個最新的 phpmyadmin 目錄。
  4. mv失敗(見下面的錯誤)。因為該目錄phpMyAdmin-4.7.7-all-languages保留在我的主目錄中:它沒有像我預期的那樣被移動到drt並且沒有將其名稱更改為。phpmyadmin
  5. 最後一次rm成功 - zip 在我的主目錄中被刪除。

我沒有收到錯誤 fr wget

此外,似乎 的值以pma某種方式更改為phpMyAdmin-4.7.7-all-languages。我沒有將其更改為該值。

什麼可能在這裡失敗,為什麼?

您使用的unzip命令提取unzip執行目錄中的存檔,而不是存檔所在的位置。您可以先更改到包含存檔的目錄,或者使用-d選項

[-d exdir]

提取文件的可選目錄。預設情況下,所有文件和子目錄都在目前目錄中重新創建;

我可能會選擇 chdir 選項:

#!/bin/bash
cd "$drt"
rm -r ${pma}*
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip phpMyAdmin-latest-all-languages.zip
mv ${pma}*/ phpmyadmin/
rm phpMyAdmin-latest-all-languages.zip

此外,當您說“以pma某種方式更改為”的值時phpMyAdmin-4.7.7-all-languages,請注意使用未引用的變數將導致它被用作文件名模式,因此echo $pma*如果有任何匹配模式,將顯示現有文件的名稱。

(我不確定是否需要不區分大小寫的模式;是否有現實的理由期望名稱格式從更改phpMyAdminphpmyadmin?)

引用自:https://unix.stackexchange.com/questions/423426