Bash

Bash - 在for循環中獲取包含空格的字元串

  • July 6, 2017

我正在嘗試編寫一個對子集中的每個目錄進行操作的 bash 腳本。不幸的是,路徑包含空格,我無法更改名稱。

for循環堅持在每個空間打破; 我嘗試了數十種變體,但無法提出解決方案。

簡化版本如下。

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in `ls -d "$SOURCE"/201*`
do
   echo "File: $file"
done

誰能建議我如何獲取每個條目,例如/Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735在一個單獨的變數中。

如果目錄中的文件沒有空格:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
for file in $(ls -d ./201*)
do
   echo "File: $file"
done

如果不確定目錄列表中是否存在空格,請改為執行以下操作:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
shopt -s nullglob
for filename in 201*;do
  if [[ ! -d "$filename" ]];then
     echo "$filename"
  fi
done
shopt -u nullglob

我不清楚您是否想要目錄文件名,如果沒有,這就是有效的。

當您不知道是否有空格我相信時,第二個是通常首選的解決方案。

變化最小的解決方案是:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in "$SOURCE"/201*
do
   echo "File: $file"
done

另一種選擇(如果您在更改位置參數方面沒有問題):

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
set -- "$SOURCE"/201*
for file; do
   echo "File: $file"
done

一種更精確的解決方案,可以避免目錄並使用空格(但不是換行符)處理文件:

ls -dp "$a"/201* | grep -v '/$' | 
   while read f; do echo "File:$f"; done

或者適用於任何名稱的解決方案,但也可能列出點文件(如果名稱匹配):

find "$a" -type f -name "201*" -exec echo "File: {}" \;

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