Bash
rm 或 wget 在基於帶有 glob 的變數的腳本中失敗
我在文件名 glob
rm
或wget
.在 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
該腳本部分成功:
- 第一個
rm
可能成功或可能導致以下所有問題。wget
部分成功 - 一個帶有新 PMA 副本的 zip 被下載到我的主目錄而不是drt
.- 成功了,
unzip
解壓了 zip,我得到了一個最新的 phpmyadmin 目錄。mv
失敗(見下面的錯誤)。因為該目錄phpMyAdmin-4.7.7-all-languages
保留在我的主目錄中:它沒有像我預期的那樣被移動到drt
並且沒有將其名稱更改為。phpmyadmin
- 最後一次
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*
如果有任何匹配模式,將顯示現有文件的名稱。(我不確定是否需要不區分大小寫的模式;是否有現實的理由期望名稱格式從更改
phpMyAdmin
為phpmyadmin
?)