我正在制作的脚本的目的是比较两个系列的文件。文件名本身存储在两个单独的文件中,每行一个路径。我的想法是有两个while read循环,每个文件名列表一个循环,但是如何将两个循环混合在一起?
while read compareFile <&3; do
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo "Comparing file - $compareFile"
if diff "$compareFile" _(other file from loop?_) >/dev/null ; then
echo Same
else
echo Different
fi
done 3</infanass/dev/admin/filestoCompare.txt
Run Code Online (Sandbox Code Playgroud)
我需要能够通过两个 while 读取循环同时比较来自两个不同列表的文件......这甚至可能吗?
有一个众所周知的while condition; do ...; done循环,但是否有一种do... while样式循环可以保证至少执行一次块?
为什么是这样?
if true; then sleep 3 &; fi
bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)
我想跑
sleep 3
Run Code Online (Sandbox Code Playgroud)
在后台,以便命令 ["sleep 3" 只是一个示例] 将以“并行”样式运行,因此它完成得更快。但我得到这个:
bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)
错误信息。为什么?为什么我不能向后台发送任务?
我想检查工作目录中是否存在多个目录,例如dir1,dir2和dir3。
我有以下
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Run Code Online (Sandbox Code Playgroud)
但我怀疑有一种更优雅的方式来做到这一点。不要假设目录名称中存在模式。
目标是检查几个目录的存在和其他目录的不存在。
我正在使用 Bash,但首选可移植代码。
目前我使用两个不同的while循环来启动我的窗口管理器dwm和将系统信息打印到它的状态栏。
我目前的解决方案是在同一个脚本中连续运行它们,如下所示:
while true; do
$HOME/Scripts/dwm-status
sleep 2s
done &
while true; do
dwm >/dev/null
done
Run Code Online (Sandbox Code Playgroud)
while true; do
while true; do
$HOME/Scripts/dwm-status
sleep 2s
done &
dwm >/dev/null
doneRun Code Online (Sandbox Code Playgroud)
第二个似乎导致 CPU 峰值。在效率方面(最少占用资源等),运行这两个循环的最佳方法是什么,为什么?
这是错误还是功能?
对于未引用的字母数字,似乎会发生这种情况。
运行 GNU bash,版本 4.1.5
for alpha01234; do echo $((++i)); done
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
Run Code Online (Sandbox Code Playgroud) 对于类,我需要编写一个 Bash 脚本来获取输出ispell,当我尝试在 while 循环中请求用户输入时,它只会将文件的下一行保存为用户输入。
我怎样才能在 while 循环中请求用户输入?
#!/bin/bash
#Returns the misspelled words
#ispell -l < file
#define vars
ISPELL_OUTPUT_FILE="output.tmp";
INPUT_FILE=$1
ispell -l < $INPUT_FILE > $ISPELL_OUTPUT_FILE;
#echo a new line for give space between command
#and the output generated
echo "";
while read line;
do
echo "'$line' is misspelled. Press "Enter" to keep";
read -p "this spelling, or type a correction here: " USER_INPUT;
if [ $USER_INPUT != "" ]
then
echo "INPUT: $USER_INPUT";
fi
echo ""; …Run Code Online (Sandbox Code Playgroud) zsh 手册页在test(aka [)部分明确建议不要使用它,并敦促读者[[尽可能使用它。
在相关章节中指出:
该命令尝试在指定的位置实现 POSIX 及其扩展。不幸的是,语法中存在内在的歧义;特别是测试运算符和类似它们的字符串之间没有区别。该标准试图解决这些问题的少量参数(最多四个);不能依赖五个或更多参数的兼容性。敦促用户尽可能使用
[[没有这些歧义的“ ”测试语法。
我想我遇到过类似的 bash 建议,但是当我浏览 bash 手册页时,我找不到任何关于使用哪种表单([或[[)的“官方”建议。(也许我错过了?)
除了向后兼容“旧外壳”之外,还有什么理由可以
[在 bash 脚本中使用吗?或者换种方式,确实庆典保持[连同[[其原因其他比向后兼容?
我有这个 while 循环和 here-document 组合,我在 Bash 4.3.48(1) 中运行,我根本不明白它的逻辑。
while read file; do source ~/unwe/"$file"
done <<-EOF
x.sh
y.sh
EOF
Run Code Online (Sandbox Code Playgroud)
我的问题由以下部分组成:
read这里做什么(我总是read用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。
是什么意思while read?while进来的概念从哪里来?
如果 here-document 本身出现在循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done,而不是在循环内部,那么这两个结构之间的实际关联是什么?
为什么这会失败?
while read file; do source ~/unwe/"$file" done <<-EOF
x.sh
y.sh
EOF
Run Code Online (Sandbox Code Playgroud)
我的意思是,done是done...那么为什么done <<-EOF与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for循环是单行的并且仍然有效。
我正在busybox 会话中编写一个bash 脚本。
该脚本必须以守护程序的形式按顺序多次启动外部可执行文件,然后监视输出。
while read LINE; do
VARIABLEPARAMETER=`echo "$LINE" | sed -e 's/appropriateregex(s)//'`
externalprog --daemonize -acton $VARIABLEPARAMETER -o /tmp/outputfile.txt
until [ "TRIGGERED" = "1" ]; do
WATCHOUTPUT=`tail -n30 /tmp/outputfile.txt`
TRIGGERED=`echo "$WATCHOUTPUT" | grep "keyword(s)"`
if [ -z "$TRIGGERED" ]; then
PROGID=`pgrep externalprog`
kill -2 "$PROGID"
continue
fi
done
done < /tmp/sourcedata.txt
Run Code Online (Sandbox Code Playgroud)
我的问题是 continue 命令将针对两个循环中的哪一个执行?
最初的 while 读取行,还是随后的,直到触发?
请不要专注于我将它们放在一起作为尝试解释这个问题的示例的实际代码,实际代码要详细得多。
control-flow ×10
bash ×7
shell ×5
shell-script ×4
directory ×1
files ×1
read ×1
test ×1
user-input ×1
variable ×1
zsh ×1