我想grep与包含该<字符的 PCRE 表达式一起使用。Bash 认为我想重定向,但我不想。我怎样才能逃脱<?
我在哪里可以找到/proc/sys(ob Linux) 中列出的内核参数的技术说明?
有时需要在小例子中模拟和验证上述变量,然后可以立即复制到某些脚本等。
我试图通过以下方式使用一个简单的例子来解决:
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
Run Code Online (Sandbox Code Playgroud)
以及其他组合。还通过添加 shebang 解释器指令进行了试验#!/bin/sh -x,但没有得到预期的结果。
我可以简单地做到这一点吗?
我有 file.txt 需要读入 Bash 数组。然后我需要删除每个条目中的空格、双引号和除第一个逗号之外的所有内容。这是我已经走了多远:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
Run Code Online (Sandbox Code Playgroud)
除了逗号情况外,这很好用。我知道有多种方法可以给这只猫剥皮,但由于脚本较大,这是其中的一部分,我真的很想使用参数替换来到达这里:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Run Code Online (Sandbox Code Playgroud)
这可以通过参数替换吗?
以下变量用于获取位置参数:
$1, $2, $3, etc.
$@
$#
Run Code Online (Sandbox Code Playgroud)
但是它们用于脚本的位置参数和函数的位置参数。
当我在函数内使用这些变量时,它们会给出函数的位置参数。
有没有办法从函数内部获取脚本的位置参数?
我不明白这个脚本。
getopt_simple()
{
echo "getopt_simple()"
echo "Parameters are '$*'"
until [ -z "$1" ]
do
echo "Processing parameter of: '$1'"
if [ ${1:0:1} = '/' ]
then
tmp=${1:1} # Strip off leading '/' . . .
parameter=${tmp%%=*} # Extract name.
value=${tmp##*=} # Extract value.
echo "Parameter: '$parameter', value: '$value'"
eval $parameter=$value
fi
shift
done
}
Run Code Online (Sandbox Code Playgroud)
if [ ${1:0:1} = '/' ]在上面编写的代码之后我需要一些帮助,我的问题是:
考虑以下示例:
IFS=:
x="a :b" # three spaces
echo ["$x"] # no word splitting
# [a :b] # as is
echo [$x] # word splitting
# [a b] # four spaces
Run Code Online (Sandbox Code Playgroud)
分词识别单词"a "(三个空格)和"b",用冒号分隔,然后echo用中间的空格连接单词。
但是,当使用 的值$x作为函数参数时,我发现很难解释结果。
args(){ echo ["$*"];}
args a :b # three spaces
# [a::b]
Run Code Online (Sandbox Code Playgroud)
和:
args(){ echo [$*];}
args a :b # three spaces
# [a b] # two spaces
Run Code Online (Sandbox Code Playgroud)
$*扩展为所有位置参数组合的值。此外,"$*"相当于"$1c$2",其中c是 IFS 变量值的第一个字符。
args(){ …Run Code Online (Sandbox Code Playgroud) parameter variable-substitution arguments variable bash-expansion
我想使用2.6.2 参数扩展从字符串中删除前导字符,但惊讶地发现“删除最大前缀模式”不会自动重复该模式。
$ x=aaaaabc
$ printf %s\\n "${x##a}"
aaaabc
Run Code Online (Sandbox Code Playgroud)
如您所见,只有第一个a已被删除。预期输出为、、或中bc的任何一个。x=bcx=abcx=aabcx=aaabcx=aaaabc
a如果我想从 的开头删除尽可能多的内容,我正在努力弄清楚如何编写该模式$x。我也没有运气搜索其他线程,因为许多答案都使用 bash,但我正在寻找 POSIX shell 解决方案。
这个问题听起来可能很复杂,但事实上并非如此!考虑:
% f() { echo "$@"; }
% f a
a
% f cmd -o"value with space"
cmd -ovalue with space
% f cmd -ovalue with space
cmd -ovalue with space
% f cmd -o'value with "quotes"'
cmd -ovalue with "quotes"
% f cmd -ovalue with "quotes"
cmd -ovalue with quotes
Run Code Online (Sandbox Code Playgroud)
显然,“带空间的值”只是一个参数的属性丢失了;同样,双引号在重新输入时也会被“吃掉”。
所需的输出是可以再次用作输入以产生相同输出的输出。
我不认为 BASH 中内置了允许这样做的东西,对吧?
如果我想要做什么并不明显:我有一个存储在 shell 数组中的命令,并且我想将这样的数组打印到标准输出,以便用户可以复制并粘贴输出以在 shell 提示符(或script),以便重现数组中的相同命令。
考虑这个(愚蠢的)例子:
> X=(echo "Bob's car is named \"Bobby\"")
Run Code Online (Sandbox Code Playgroud)
一个普通的echo "${X[@]}"会输出
echo 鲍勃的车名为“鲍比”
而一种可能的正确输出可能是
echo …
我需要读取和写入$@函数调用者的位置参数。Bash 手册页说:
shell 函数是一个对象,它像一个简单的命令一样被调用,并使用一组新的位置参数执行一个复合命令
所以$@在每次调用时都会重写。我寻找了一些“特殊参数”,但一无所获。shell 变量BASH_ARGV似乎解决了我的问题,但是它需要shopt -s extdebug启用,在我的机器中不是默认行为,也不是在生产中打开的选项。
extdebug
If set, behavior intended for use by debuggers is enabled:
...
4. BASH_ARGC and BASH_ARGV are updated as described in their
descriptions above.
...
Run Code Online (Sandbox Code Playgroud)
Bash 是否能够在$@没有 的情况下读取或写入函数的调用者BASH_ARGV?您是否认为 Bash 受到限制并使用另一个 shell 进行脚本编写?
编辑:我想要getopt在我的助手库中使用一个精美的包装器。所以与它相关的所有行为都在一个函数中。无需检查错误或set --.