假设我创建了以下变量:
s=John
i=12345
f=3.14
Run Code Online (Sandbox Code Playgroud)
所有这些变量都是作为字符串存储在内存中的,还是bash
有其他数据类型?
我在我工作中的一个程序的文档中看到了这个命令:
cp company-sso /usr/local/bin/company-sso ; sudo chmod +x !cp:$
Run Code Online (Sandbox Code Playgroud)
我知道这:
会阻止执行下一个命令,它只会被评估,但这如何工作$
?我只见过$
在变量名之前使用过,例如$USER
or$HOME
但从来没有单独使用过。还有,怎么操作!cp
?不会执行cp
?这样做的目的是什么?这整条线有意义吗?
我正在练习带有选项\r
(回车)的echo 命令,如下所示。
echo -e "This is \r my college"
Run Code Online (Sandbox Code Playgroud)
输出:
my college
Run Code Online (Sandbox Code Playgroud)
但是当我在\r
下面再添加一个词时
echo -e "This is the \r my college"
Run Code Online (Sandbox Code Playgroud)
然后它给了我这样的输出:
my college the
Run Code Online (Sandbox Code Playgroud)
另一个例子
echo -e "This is \r valid data"
valid data
echo -e "This is not a \r valid data"
valid data a
Run Code Online (Sandbox Code Playgroud)
所以,我想知道这里回车的实际目的是什么?
这适用于 shell (bash, dash) 提示:
[ -z "" ] && echo A || echo B
A
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试编写一个POSIX shell 脚本,它是这样开始的:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但我没有收到消息:
给定的参数为空。
如果我这样调用脚本:
./test_empty_argument ""
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我正在尝试使用该select
命令实现一个简单的菜单。脚本(用于测试目的)如下:
#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
case $opt in
"apache")
date
;;
"named")
echo "test"
;;
"sendmail")
echo "test 2"
;;
*) echo "invalid option";;
esac
done
echo "*********************"
Run Code Online (Sandbox Code Playgroud)
该脚本无法识别我提供的任何有效输入,并始终打印“无效选项”消息。这个脚本做错了什么?
我在 Bash 中发现了一些以$
符号开头的特殊参数。例如:当我徘徊退出状态我知道$?
,进程ID由 $$
等
所以,我分享 这篇文章是为了了解哪些是特殊的 bash(shell)参数及其用法。
以下是我要完成的某种伪代码:
#!/bin/bash
# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])
# This is basically what I want to do with it:
for i in {1..$numlines}; do
# the part below is already figured out as well:
do some other stuff
done
Run Code Online (Sandbox Code Playgroud)
通过在“{1..n}”序列中插入实际数字,我可以从命令行很好地执行它。我只需要知道是否可以在这里包含一个变量以及如何去做。
export
了{1..${numlines}}
{1.."$numlines"}
$
:{1..\$numlines}
我是否需要使用set -[something]
命令才能扩展此变量?我什至尝试过某些形式的使用eval
...都无济于事。
我只需要知道我是否遗漏了一些简单或晦涩的东西,或者在我浪费时间之前这是否可能。
我可以拼凑出一种非常非常hackish 的方式来让它根据需要工作,但如果可能的话,我想避免这种情况,并学习正确的方法来做这件事。
我想检查第一个命令行参数 ( $1
) 是否至少有 10 个字符,以及它是否为空。
该脚本被称为:
./myscript.sh 2018-08-14
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不起作用
timestamp="$1"
# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
echo "Parameter 1 is empty"
exit 0
elif [! "${#timestamp}" -gt 10 ]; then
echo "Please enter at least a valid date"
echo "Example: 2018-08-14"
exit 0
else
echo "THIS IS THE VALID BLOCK"
fi
Run Code Online (Sandbox Code Playgroud) 在这两种情况下,和 都会PS1='\\ $ '
在PS1='\\\\ $ '
视觉上产生相同的提示。\ $
为什么?这是一个错误还是记录的行为?
在 bash 5.2.021 和 dash 0.5.12 上测试。我只在 bash 中观察到它,但在 dash 中没有观察到。
我sed 's=.*/=='
在 sh 脚本的上下文中看到了,我很困惑。我在 sed 手册或网络搜索(for sed s=
)中找不到如何s
使用,而不是s///
. 除了s
我在这里只看到一个潜在的命令=
(打印当前输入行号),但在这种情况下,其余的在做什么......
在 shell 中运行命令会产生与 eg 的输入相同的输出echo 'jkfdsa=335r34'
,而echo 'jkfdsa=335r34' | sed 's/=.*/==/'
根据手册进行替换。也稍微修改 command 为 eg echo 'jkfdsa=3' | sed 's798=.*/==/'
given
sed: -e expression #1, char 11: unterminated 's' command
,所以 original 应该有一些正确的含义。它是什么?