我想創建一個簡單的互動式選擇 bash 腳本,它應該顯示特定檔案夾的目錄串列,并且根據第一個選擇它應該在這個檔案夾中進行第二個選擇。通過這兩個選擇,腳本將做一些特定的事情。
這是啟動腳本的樣子:
#!/bin/bash
title="Project"
prompt="Select project"
options=("A", "B") # How to use subfolders of a specific folder?
echo "$title"
PS3="$prompt "
select opt in "${options[@]}" "Quit"; do
case "$REPLY" in
1) echo "$opt";; # do something specific to this value
2) echo "$opt";; # do something specific to this value
$((${#options[@]} 1))) echo "Goodbye."; break;;
*) echo "Invalid option."; continue;;
esac
done
而不是硬編碼選項,我想使用這個結果:
for d in apps/*/ ; do basename "$d" ; done
我如何獲得這個結果作為options價值?
在選擇之后,它應該對這個選定的檔案夾做同樣的事情:
for d in apps/$opt/*/ ; do basename "$d" ; done
根據這個選擇,應該做不同的事情/命令/計算。
概括
用戶應選擇特定目錄的子檔案夾 (=app),然后再次選擇子檔案夾 (=project)。有了這個,我確實有兩個值(應用程式和專案)用于進一步計算。
uj5u.com熱心網友回復:
通配符將在任何情況下得到擴展。
options=( */ )
根據您的用戶(缺乏)復雜性,您可能希望對結果進行后處理;這將填充陣列,A/ B/其中尾部斜杠對于僅選擇目錄很重要。
(在許多情況下,變數是不必要且稍微浪費的間接;如果您不關心后處理,您可以簡單地說
select opt in */ "Quit"
直接地。根據您的用例,您可能還需要或需要添加前綴./,以消除以減號開頭的任何目錄的歧義。)
要在每個條目上顯式運行basename,可以使用回圈來填充陣列:
# local n
options=( )
for n in ./*/; do
options =("$(basename "$n")")
done
通常,您希望盡可能避免外部流程;引數擴展會稍微笨拙,但效率更高。
專注于這個select問題,我猜你正在尋找類似的東西
select opt in */ "Quit"
do
case "$REPLY" in
"Quit") break;;
esac
select final in "app/$opt"/* "Quit"
do
case "$REPLY" in
"Quit") break;;
esac
echo "You chose $REPLY"
done
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515823.html
標籤:重击
上一篇:遍歷檔案夾中的檔案,重命名它們并將第n次出現的字符與另一個字符切換
下一篇:創建特定于一個專案的Git別名
