或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world,它被视为两个单独的文件hello和world.\[*?,它们会被一些文本替换,这实际上是文件的名称。'(或双引号"),在那之后事情变得很奇怪。\分隔符)。这是怎么回事,我该如何解决?
如何在 bash 脚本中获取文件的大小?
我如何将它分配给一个 bash 变量,以便我以后可以使用它?
这个问题是我之前问题的续集。该站点上的用户帮助我确定了如何编写一个for遍历字符串值的 bash循环。例如,假设循环控制变量fname遍历字符串"a.txt" "b.txt" "c.txt"。我想echo“是的!” 何时fname具有值"a.txt"or "c.txt",并且echo“不!” 除此以外。我尝试了以下 bash shell 脚本:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Run Code Online (Sandbox Code Playgroud)
我获得输出:
一个.txt
不!
b.txt
不!
文件
是的!
为什么该if语句在fname具有 value时显然会产生 true "a.txt"?我用|错了吗?
当我在没有指定可执行文件的完整路径的情况下执行程序时,Bash 必须搜索其中的目录$PATH才能找到二进制文件,似乎 Bash 会记住某种缓存中的路径。例如,我安装了从源代码到 的 Subversion 版本/usr/local,然后svnsync help在 Bash 提示符下键入。Bash 找到了/usr/local/bin/svnsync“svnsync”的二进制文件并执行了它。然后当我删除 Subversion 中的安装/usr/local并重新运行时svnsync help,Bash 响应:
bash: /usr/local/bin/svnsync: No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,当我启动一个新的 Bash 实例时,它会找到并执行/usr/bin/svnsync.
如何清除可执行文件路径的缓存?
我想要一个这样的shell脚本:
my-app &
echo $my-app-pid
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何获取刚刚执行的命令的pid。
我知道我可以只使用jobs -p my-app命令来grep pid。但是如果我想多次执行shell,这个方法就行不通了。因为工作规范是不明确的。
有没有办法为 git(或任何命令)的输出着色?
考虑:
baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: app/models/message_type.rb
#
no changes added to commit (use "git add" and/or "git commit -a")
baller@Laptop:~/rails/spunky-monkey$ git add app/models
Run Code Online (Sandbox Code Playgroud)
和
baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes to be committed:
# (use "git reset HEAD <file>..." to …Run Code Online (Sandbox Code Playgroud) 当我在本地工作时,我已经在远程机器上运行了一个脚本。我可以以同一用户身份通过 SSH 连接到机器,并查看在ps.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Run Code Online (Sandbox Code Playgroud)
它只是在本地会话上输出到标准输出(我从./ipchecker.sh本地终端窗口运行,没有重定向,没有使用screen等)。
无论如何,我可以从 SSH 会话中查看此运行命令的输出(不停止它)吗?
到目前为止,我发现的最好的方法是使用,strace -p 18386但我在屏幕上看到成群的文本,它太详细了。我可以停下来strace,然后筛选输出,发现文本带打印到标准输出,但它非常长且令人困惑,很明显,当它停止时,我可能会错过一些东西。我想找到一种方法来实时查看脚本输出,就像我在本地工作一样。
任何人都可以改进吗?显而易见的答案是通过重定向或在screen会话等中重新启动脚本,这不是关键任务脚本,所以我可以这样做。相反,我认为这是一个有趣的学习练习。
下面是一个cut使用空格分隔符将输入分成多个字段并获取第二个字段的示例:
cut -f2 -d' '
如何将分隔符定义为制表符而不是空格?
以下 bash 语法验证是否param不为空:
[[ ! -z $param ]]
Run Code Online (Sandbox Code Playgroud)
例如:
param=""
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
没有输出,很好。
但是当param除了一个(或多个)空格字符为空时,情况就不同了:
param=" " # one space
[[ ! -z $param ]] && echo "I am not zero"
Run Code Online (Sandbox Code Playgroud)
“我不是零”是输出。
如何更改测试以将仅包含空格字符的变量视为空?
bash ×10
shell ×4
shell-script ×3
process ×2
bashrc ×1
cache ×1
colors ×1
cut ×1
executable ×1
files ×1
git ×1
history ×1
quoting ×1
string ×1
whitespace ×1