我正在编写一个脚本,它需要一步计算命令输出中的字符数。
例如,使用该命令readlink -f /etc/fstab应该返回,10因为该命令的输出长度为 10 个字符。
这已经可以使用以下代码存储变量:
variable="somestring";
echo ${#variable};
# 10
Run Code Online (Sandbox Code Playgroud)
不幸的是,对命令生成的字符串使用相同的公式不起作用:
${#(readlink -f /etc/fstab)};
# bash: ${#(readlink -f /etc/fstab)}: bad substitution
Run Code Online (Sandbox Code Playgroud)
我知道可以通过首先将输出保存到变量来做到这一点:
variable=$(readlink -f /etc/fstab);
echo ${#variable};
Run Code Online (Sandbox Code Playgroud)
但我想删除额外的步骤。
这可能吗?最好仅使用内置或标准实用程序与 Almquist shell (sh) 兼容。
如何使用变量 -$BASE在我的 cd 中。我尝试了以下操作,但出现错误
$ cd ~/z/repo_1_ruby_193/
23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193
$ BASE="~/z"
23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193
$ cd $BASE/repo_1_ruby_193
-bash: cd: ~/z/repo_1_ruby_193: No such file or directory
23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193
Run Code Online (Sandbox Code Playgroud) 我一直在为我的 Unix 考试而学习,我经常看到感叹号变量 -$!
如果我echo $!在 Mac shell 上写下诸如“你有邮件……”之类的信息
这样做的目的是存储我是否有任何邮件或还有其他东西吗?
编辑:有趣的巧合发生了。就在我写echo $!我的 Shell 时,也通知我我有一些邮件。所以这就是我写邮件部分的原因。
所以如果我有一个变量
VAR='10 20 30 40 50 60 70 80 90 100'
Run Code Online (Sandbox Code Playgroud)
并呼应出来
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
Run Code Online (Sandbox Code Playgroud)
但是,在脚本的进一步下方,我需要颠倒此变量的顺序,以便它显示为类似
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
Run Code Online (Sandbox Code Playgroud)
我尝试使用 rev 并且它实际上颠倒了一切,所以它出来了
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
Run Code Online (Sandbox Code Playgroud) {}如果缺少 envvar,我似乎无法得到一个空的 JSON来回显。}如果设置,我要么在输出中有尾随,要么显示转义。
bash-3.2$ unset X
bash-3.2$ echo "${X:-{}}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-{}}"
y}
bash-3.2$ echo "${X:-{\}}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-{\}}"
{\}
bash-3.2$ echo "${X:-'{}'}"
'{}'
bash-3.2$ X=z
bash-3.2$ echo "${X:-'{}'}"
z
Run Code Online (Sandbox Code Playgroud)
我如何正确逃脱它?
假设我已经声明了以下变量:
$ var='$test'
$ test="my string"
Run Code Online (Sandbox Code Playgroud)
如果我打印它们的内容,我会看到以下内容:
$ echo $var
$test
$ echo $test
my string
Run Code Online (Sandbox Code Playgroud)
我想找到一种方法来打印内容的内容$var(即 的内容$test)。所以我尝试执行以下操作:
$ echo $(echo $var)
$test
Run Code Online (Sandbox Code Playgroud)
但这里的结果是$test而不是"my string"......是否可以使用bash打印变量内容的内容?
我有一个 Makefile,它有一个变量,如果变量未设置或设置但具有空值,则该变量需要具有默认值。
我怎样才能做到这一点?
我需要这个,因为我在 shell 脚本中调用 make 并且 makefile 所需的值可以作为 $1 从 shell 传递。并将其传递给 makefile,我必须将其设置在 bash-script 中。
想法:(不优雅)在 bash 脚本内部,可以检查变量是否已设置但具有空值,在这种情况下可以取消设置。
注意:如果变量未在终端中定义,以下将不起作用,因为它们是在 bash 脚本中设置的。
dSourceP?=$(shell pwd)
Source?=$(notdir $(wildcard $(dSourceP)/*.md))
Run Code Online (Sandbox Code Playgroud)
make all dSourceP="${1}" Source="${2}"
Run Code Online (Sandbox Code Playgroud)
bash ./MyScript.sh
bash ./MyScript.sh /home/nikhil/MyDocs
bash ./MyScript.sh /home/nikhil/MyDocs index.md
Run Code Online (Sandbox Code Playgroud) 这个想法是将它用作...命令中的管道。例如:假设有某种很长的路径必须一次又一次地重新输入,然后是管道和第二个程序,即
"directory1/directory2/direcotry3/file.dat | less -I "
Run Code Online (Sandbox Code Playgroud)
我希望将该部分存储在一个变量中,因此可以像这样使用它:
r="directory1/directory2/direcotry3 \| less -I -p "
$ cat path1/path2/$r <searchterm>
Run Code Online (Sandbox Code Playgroud)
相反,我得到
cat: invalid option -- I
Try `cat --help' for more information.
Run Code Online (Sandbox Code Playgroud)
...意味着管道显然没有工作。
有没有办法序列化shell变量?假设我有一个变量$VAR,并且我希望能够将它保存到文件或其他内容中,然后稍后再读回以获取相同的值?
有没有一种便携的方式来做到这一点?(我不这么认为)
有没有办法在 bash 或 zsh 中做到这一点?