Bash - 从脚本中删除换行符



我有一个脚本,我基本上已经完成了,除了一个问题,我似乎无法在将换行符传递给 zbarimg 之前将其删除。我在网上尝试了各种东西,似乎找不到任何东西来摆脱这个讨厌的角色。任何帮助将不胜感激。

#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file
  do
    ifile=$(ls -Art ~/Public | tail -n 1)
    ifile2=$(echo $ifile | tr 'n' ' ')
    echo $ifile2 >> /tmp/latest.txt
    zbarimg $ifile2 | pluma
  done

ls -alrt 的输出(最后几行(

-rw-r--r--  1 mintux mintux   875988 Nov 11 12:42 20151111_114942.jpg
-rw-r--r--  1 mintux mintux   801317 Nov 11 12:45 20151111_114759(2).jpg
-rw-r--r--  1 mintux mintux   875988 Nov 11 12:45 20151111_114942(2).jpg
-rw-r--r--  1 mintux mintux      911 Nov 23 23:24 nov23.png
-rw-r--r--  1 mintux mintux    23158 Nov 23 23:43 nov23a.png
drwxr-xr-x 73 mintux mintux    24576 Nov 24 08:42 ..
drwxr-xr-x  4 mintux mintux     4096 Nov 24 12:10 .

你的问题有点不清楚,但在下面的脚本中,ifileifile2的末尾都没有newline('n'(。虽然很难准确确定您尝试根除的newline,但您的目标似乎是防止在将$ifile2重定向到文件后将newline写入/tmp/latest.txt。(这是唯一可以想象的争议newline(整个交易中唯一涉及的newlineecho本身放在那里的newline

#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file
do
    ifile=$(ls -Art ~/Public | tail -n 1)
    ifile2=$(echo $ifile | tr 'n' ' ')
    echo $ifile2 >> /tmp/latest.txt
    zbarimg $ifile2 | pluma
done

如果你不想newline写入/tmp/latest.txt,那么使用echo -nprintf,例如:

#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file
do
    ifile=$(ls -Art ~/Public | tail -n 1)
    echo -n "$ifile" >> /tmp/latest.txt  # or printf "%s" "$ifile"
    zbarimg "$ifile" | pluma
done

注意:您可以通过以下方式证明自己没有换行符:

echo "'$ifile'"

注意2:在bash中,除非在[[...]]内部,否则您应该始终引用变量。(如果你不记得[[...]],那么总是引用你的变量(。此外,使用ls(任何排序顺序(填充变量ifile容易受到许多细微的文件名错误(文件名中的换行符等(的影响。请参阅 Bash 陷阱 有关尝试迭代ls返回所涉及的相关原因。


"当我在脚本之外手动运行它时,它可以很好地打开它 但抛出有关无法从 in 打开文件的错误 它"。

好吧,这更有意义。在"$folder"中查找最新文件而不使用解析ls时固有的 pitfal 的一种方法是:

#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file
unset -v ifile
for fname in "$folder"/*; do
    [[ $fname -nt $ifile ]] && ifile="$fname"
done
zbarimg "$ifile" | pluma

试一试,让我知道是否可以解决问题。

因此,在所有这些之后,事实证明真正的问题是我只是忘记将文件夹附加到文件名中,因此zbarimg无法打开文件的原因与换行符无关,就像我认为这里基本上是修复它的原因:

zbarimg $folder/$ifile2

再次感谢所有提供帮助的人,对不起我的无能,愿互联网的祝福和宽恕降临到我身上:)

最新更新