或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world,它被视为两个单独的文件hello和world.\[*?,它们会被一些文本替换,这实际上是文件的名称。'(或双引号"),在那之后事情变得很奇怪。\分隔符)。这是怎么回事,我该如何解决?
我想从输出的每一行中删除所有前导和尾随空格和制表符。
有没有一个简单的工具,比如trim我可以将我的输出输入到其中?
示例文件:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Run Code Online (Sandbox Code Playgroud) 在 Vim 中,如果我粘贴此脚本:
#!/bin/sh
VAR=1
while ((VAR < 10))
do
echo "VAR1 is now $VAR"
((VAR = VAR +2))
done
echo "finish"
Run Code Online (Sandbox Code Playgroud)
我得到了这些奇怪的结果:
#!/bin/sh
#VAR=1
#while ((VAR < 10))
# do
# echo "VAR1 is now $VAR"
# ((VAR = VAR +2))
# done
# echo "finish"
#
Run Code Online (Sandbox Code Playgroud)
哈希符号 (#) 和制表符已出现。为什么?
如果我执行一系列命令,例如:
$ ls
$ grep abc file.txt
Run Code Online (Sandbox Code Playgroud)
然后使用向上箭头键获取上一个,终端将显示最后一个cmd(这是grep这里)
但如果我做这样的事情:
$ ls
$ grep abc file.txt
Run Code Online (Sandbox Code Playgroud)
wheregrep前面有空格,向上按给出ls,而不是grep。
为什么是这样?
这是我得到的错误,它失败是因为一个变量的值应该是 2(我使用 a 得到这个select * from tabel)。我在那个变量中得到了空格。
+ 0 !=
2
./setjobs[19]: 0: not found.
Run Code Online (Sandbox Code Playgroud)
如何从该变量中删除所有这些空格或换行符?可以tr,,sed或任何帮助?
这就是我正在做的:
set_jobs_count=$(echo "set heading off;
select count(*) from oppar_db
where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \
sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME)
Run Code Online (Sandbox Code Playgroud)
这按建议工作:
| sed 's/[[:space:]]//g'
Run Code Online (Sandbox Code Playgroud)
但我仍然获得一个值,如:
set_jobs_count=
2
Run Code Online (Sandbox Code Playgroud) 我找到了大量网站,它们解释了如何在更改行尾时让 git 警告您,或者使用其他各种技术来防止您弄乱整个文件。假设现在为时已晚——树已经有切换文件行尾的提交,因此git diff显示旧文件的减法,然后添加具有相同内容的新文件
我正在寻找一个 git 配置选项或命令行标志,它告诉diff忽略那些 - 如果两行只有空格不同,假装它们是相同的。我需要这个配置选项/标志工作任何依赖文件的差异- diff,blame甚至merge/rebase理想-我想git完全忽略尾随的空白,尤其是行尾。我怎样才能做到这一点?
.vimrc保存文件时是否有自动删除尾随空格的设置?
理想情况下(为了安全起见)我只想对某些文件使用此功能,例如 *.rb
当脚本在一年的开始两天运行时,我使用下面的脚本将两天后移,并检查每个月的第一天和第二天,然后将后移两天。
if [$month="01"] && [$day="01"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
Run Code Online (Sandbox Code Playgroud)
但我的坏消息是收到以下错误消息
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Run Code Online (Sandbox Code Playgroud) 我已经看到 Bash 脚本指南建议使用数组来处理包含空格的文件名。然而,DashAsBinSh表明数组不可移植,所以我正在寻找一种符合 POSIX 的方式来处理可能包含空格的文件名列表。
我正在寻找修改下面的示例脚本,以便它 echo
foo/target/a.jar
foo/target/b.jar
bar/target/lol whitespace.jar
Run Code Online (Sandbox Code Playgroud)
这是脚本
#!/usr/bin/env sh
INPUT="foo/target/a.jar
foo/target/b.jar
bar/target/b.jar
bar/target/lol whitespace.jar"
# this would be produced by a 'ls' command
# We can execute the ls within the script, if it helps
dostuffwith() { echo $1; };
F_LOCATIONS=$INPUT
ALL_FILES=$(for f in $F_LOCATIONS; do echo `basename $f`; done)
ALL_FILES=$(echo "$ALL_FILES" | sort | uniq)
for f in $ALL_FILES
do
fpath=$(echo "$F_LOCATIONS" | grep -m1 $f)
dostuffwith $fpath
done
Run Code Online (Sandbox Code Playgroud) 或者换一种说法,你为什么要阻止命令被写入 bash 历史记录?
(受到一个相关问题的启发。)