我正在嘗試在 Linux shell 中運行字母順序。我相信我的語法是正確的,但它不是給我每個字母,而是{a..z}一次給我。這是我所擁有的:
COUNTER=0;
for X in {a..z};
do
# Make sure usb is mounted before trying anything
sudo mkdir /media/mounts/sd${X}1
sudo mount /dev/sd${X}1 /media/mounts/sd${X}1
# Find player number from Linux mount point
DATA_DIR=/media/mounts/sd${X}1;
PLAYER_FILE_PATH=`find $DATA_DIR -name "player.*"`;
PLAYER_FILE_ONLY=`basename -- $PLAYER_FILE_PATH`;
PLAYER_NUMBER=`echo "${PLAYER_FILE_ONLY##*.}"`;
# Make sure usb device exists and player number is not empty
if [ -n "$PLAYER_NUMBER" ] && [ $PLAYER_NUMBER -gt 0 ]
then
# Let user know which tracer was found
echo "$PLAYER_NUMBER was found, creating directory to store its .dat files" | tee -a $ERR_LOG_PATH;
echo "${PLAYER_NUMBER}: " >> $LOG_PATH;
let COUNTER ;
# Create directory for player number to dump .dat files and log any errors at output
sudo mkdir $DUMP_DIR/$PLAYER_NUMBER;
NUMBER_DATS=`ls $DATA_DIR/MountsData/*.dat | wc -l`;
DAT_COUNT_ARRAY[$PLAYER_NUMBER]=$NUMBER_DATS
echo "USB $PLAYER_NUMBER has $NUMBER_DATS .dat files";
echo "${NUMBER_DATS}\r\n" >> $LOG_PATH;
cp $DATA_DIR/MountsData/*.dat $DUMP_DIR/$PLAYER_NUMBER 2>> $ERR_LOG_PATH;
# Remove all .dat files directly from usb and log any errors at output
sudo rm $DATA_DIR/MountsData/*.dat 2>> $ERR_LOG_PATH;
fi
done
我得到結果輸出:
mount: special device /dev/sd{a..z}1 does not exist
我嘗試更改變數名稱、大小寫,并將它們稱為$X而不是${X}. 我目前正在使用帶有標準 Raspbian shell 的運行 Raspbian 的 Raspberry Pi。我進行了一些測驗以確保終端中的語法正確,并且似乎 for 回圈結構是正確的。我錯過了什么嗎?
uj5u.com熱心網友回復:
你必須用 bash 來執行它。一些作業系統將 sh 鏈接到 bash,但其中一些鏈接到其他 shell 應用程式,例如 ubuntu 中的破折號。要檢查 sh 中的鏈接應用程式,請嘗試執行以下命令: file -h /bin/sh
uj5u.com熱心網友回復:
您可以撰寫一個可移植的函式,該函式將以 POSIX 兼容的方式生成串列。例如,要生成從任何字符(具有較低 ASCII 值)到任何 ASCII 字符的 ASCII 字符范圍,您可以執行以下操作:
genasciirange() {
[ -n "$1" -a -n "$2" ] || return 1
local a=$(LC_CTYPE=C printf '%d' "'$1")
local b=$(LC_CTYPE=C printf '%d' "'$2")
[ "$a" -lt "$b" -a "$a" -lt 256 -a "$b" -lt 256 ] || return 1
local c="$a"
while [ "$c" -le "$b" ]; do
printf " \\$(printf 'o' "$c")"
c=$((c 1))
done
printf "\n"
}
(-a較舊的 AND 內的條件在哪里[...],[...] && [...]如果您愿意,可以替換為)
從字符到 ASCII 值的轉換由LC_CTYPE=C printf '%d' "'$somechar"ASCII 值到字符處理,方法是轉換為八進制值,然后輸出轉義的八進制代碼,例如printf " \\$(printf 'o' "$someasciival")"
示例使用/輸出
genasciirange a z
a b c d e f g h i j k l m n o p q r s t u v w x y z
或者例如:
genasciirange Q q
Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q
在您的情況下,您可以包含該函式并將大括號擴展替換為:
for X in $(genasciirange a z)
使用jot實用程式
一個相當常見的實用程式是jot. 它只是一種seq可以生成順序或隨機資料的高級功能。例如,a-z你可以這樣做:
jot -s " " -w %c 26 a
a b c d e f g h i j k l m n o p q r s t u v w x y z
它可能已經可用于您的 Linux 發行版。如果沒有,您可以從Ubuntu 源包中的源athena-jot-9.0.orig.tar.gz構建:athena-jot (9.0-7)
awk 也可以使用。
看看事情,如果你有問題,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406186.html
標籤:
上一篇:如何在推薦中生成和使用值串列?
