【问题标题】:error when using wc -c with file names将 wc -c 与文件名一起使用时出错
【发布时间】:2017-08-26 14:14:47
【问题描述】:

我正在运行此代码,用于对所需文件夹中的文件进行排序。如果文件名有 13 个字符,它应该运行第一个语句,否则运行第二个。

for i in *.png; do if [ "$($i | wc -c)" -eq 13 ]; then
    echo cp $i $HOME/Desktop/final/pos_${i:0:1}/${i:0:3}.jpg
else
    echo cp $i $HOME/Desktop/final/pos_${i:0:1}/${i:0:4}.jpg
fi;
done

问题是,[ "$($i | wc -c)" -eq 13 ] 始终为 0,但很明显,文件名有一些长度。在 if 语句中评估 wc -c 的正确方法是什么?

【问题讨论】:

  • cp 中使用引号。也许文件名可以包含空格。 :)

标签: string bash if-statement string-length wc


【解决方案1】:

使用bash 字符串实用程序来获取字符串长度。你根本不需要wc。并且 双引号 脚本中的所有变量,以避免 shell 进行分词。

for i in *.png; do 
    if ((${#i} == 13)); then
        echo cp "$i" $HOME/Desktop/final/pos_"${i:0:1}"/"${i:0:3}".jpg
    else
        echo cp "$i" $HOME/Desktop/final/pos_"${i:0:1}"/"${i:0:4}".jpg
    fi
done

【讨论】:

    【解决方案2】:

    替换

    [ "$($i | wc -c)" -eq 13 ]
    

    通过

    [ $(printf "%s" "$i" | wc -c) -eq 13 ]
    

    或使用

    [ ${#i} -eq 13 ]
    

    【讨论】:

    • 你之前在哪里... :P
    • 对于完整的集合,还有:((${#i} == 13)) - 算术。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多