String 将wc-c与文件名一起使用时出错

String 将wc-c与文件名一起使用时出错,string,bash,if-statement,string-length,wc,String,Bash,If Statement,String Length,Wc,我正在运行这段代码,它将文件排序到所需的文件夹中。如果文件名有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

我正在运行这段代码,它将文件排序到所需的文件夹中。如果文件名有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的正确方法是什么?

替换

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

或使用

[ ${#i} -eq 13 ]

使用
bash
string实用程序获取字符串长度。您根本不需要
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

你以前在哪里p对于整个集合,也:
(${i}==13))
-算术:在
cp
中使用引号。文件名可能包含空格。:)
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