我找到了这个工具,当我下载它时,它是一个包含二进制代码的 bash 可执行文件。
首先,我不知道这是可能的。有谁知道这可以做吗?我也不确定这通常有多安全,因为我不能确定 bash 文件包含什么
Jim's questions
我有一个函数,它取决于功能更改的参数。
我知道我可以做到:
function foo {
PARAM1=$1
PARAM2="$2"
VAR=$3
if[[ -z "$VAR" ]]; then
# code here
else
# other code here
fi
}
我想知道是否有更适合 bash 的方法。这会起作用,但我不想有类似的东西
foo "x" "y" "blah"
foo "x" "y" "true"
foo "y" "y" "1"
都是等价的。
是否有更适合 Bash 的方法?
我有一个包含换行符的文件。
我通过将文件发布curl
到将其解析为 json 的服务器。
由于换行符,它拒绝请求。
但是当我这样做时:
$(echo "$MY_DATA" | sed 's/$//' | tr -d '\n\r')
它有效,但新行字符消失了。
如何转义文本以保留换行符?
我试过了tr '\n' '\\n'
,sed 's/\n/\\n/g
但两种方法都没有奏效
为什么以下给出了我正在搜索的行:
grep '<appointment-id internal:ref=1.2.3/>' test.xml
OUTPUT is <appointment-id internal:ref=1.2.3/>
虽然以下将其分成两行?
a=($(grep '<appointment-id internal:ref=1.2.3/>' test.xml))
for i in "${a[@]}"; do
echo "checking $i"
grep -n "$i" delete.xml
done
输出是:
checking <appointment-id
checking internal:ref=1.2.3/>
该文件是:
<note>
<to>Jim</to>
<from>John</from>
<heading>Reminder</heading>
<body>Some text</body>
<appointment-id internal:ref=1.2.3/>
</note>
我有一个脚本(我们称之为scriptC
),用于getopt
解析短选项和长选项并且工作正常。
该脚本的调用方式如下:
scriptA
运行使用适当参数的scriptB
调用。scriptC
问题:是否可以将相同的参数作为参数传递给scriptA
,然后最终传递给scriptC
?
脚本被称为:
scriptB "$@"
并且scriptB
最终确实如此scriptC —param1 —param2
我有一个由空格分隔的字符串,我需要连接第二个和第三个“单词”/字段,以确保如果多个空格分隔单词/字段,则可以正确处理。
以下工作正常:
tr -s " " |cut -d ' ' -f2 -f3 | tr " " "-"
我想知道有没有更简洁的方法来做到这一点?
我有一个返回值的函数。
但我想添加一些echo
s 以便于调试。但这会破坏结果。
例子:
function foo {
echo "In foo"
VAR="1234"
echo "Calculated item"
echo "$VAR"
}
RESULT=$(foo)
echo "RESULT=$RESULT"
我期待得到1234
.
相反,输出是:
RESULT=In foo
Calculated item
1234
解决此问题的正确方法是什么?
我有一个由空格分隔的 3 个字段的字符串。我想连接最后两个字段,-
确保最后的换行符被删除。
以下作品:
echo -n "abc 1234 5679" | tr -s "" |cut -d ' ' -f2 -f3 | tr " " "-"
我想知道有没有perl
这个的在线人?
我有一个带有缩进的文件。
我想替换特定行但保留缩进。
该文件有一行如
\t\t customerId = "123" // has indentation in the start of line
我正在运行这个:
sed -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file
这没有任何作用。我也知道,即使它有效,我也会弄乱缩进。我怎样才能解决这个问题?
注意:解决方案不一定是,sed
但我希望它能够跨平台
更新
测试@Gilles Quenot 答案:
OLD_ID="1234"
NEW_ID="5678"
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":" testfile
样品测试:
name="Jim"
customerId = "1234"
号码未被替换
我有一个代表一种版本的字符串。我想增加它,如果第二部分超过 9 到下一个更高的数字以下似乎有效。我想知道是否有更简洁的方法来做到这一点
FIRST=$(echo -n "$VERSION"| cut -d "." -f 1)
SECOND=$(echo -n "$VERSION"|cut -d "." -f 2)
SECOND=$((SECOND + 1))
if [[ $SECOND -ge 10 ]]; then
SECOND="0"
fi
FIRST=$(($FIRST + 1))
NEW_NUMBER=$FIRST.$SECOND
例子:
Input: 102.8 Output: 102.9
Input: 102.9 Output: 103.0
我有一个接受参数的脚本,如果未设置,则使用默认值。
VALUE=$1
if [[ -z "$VALUE" ]];
VALUE=foo #some function returns the default
fi
然后脚本继续做一些事情。
我想“增强”它并提供一些dry run
选择。所以如果通过了,我们就会有类似的东西
if [[ -z "$DRY" ]];
echo "command x y z"
else
command "x" "y" "z"
fi
我怎样才能做到这一点?
所以我正在测试以下内容:
foo() {
printf "\nAll the parameters, each on a separate line:\n"
printf "param: %s\n" "$@"
}
foo The "nicely colored" rainbow
输出是:
All the parameters:
param: The
param: nicely colored
param: rainbow
因此,如果我理解正确,因为IFS
设置为\t\n
我们得到由制表符分隔的参数(的第一个字符IFS
)。
但是为什么它们打印在不同的行中?
是每个参数的 printf 运行。即 bash 是否将其转换为 for 循环?
以下(不带双引号)也输出相同的结果:
printf "param: %s\n" $@
以下具体是做什么的?
MY_VAR=${MY_INPUT##*$'\n'}
那么为什么以下工作,即打印出比赛:
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
但以下不是:
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
有什么区别?这是同一个正则表达式
我在 Linux 安装中有一个进程,在某些时候会出现某种峰值,并通过系统允许的最大线程/进程数。我通过ps -elfT | wc -l
反复检查发现了这一点。
但我不知道究竟是什么导致了这个峰值。
的输出ps -elfT
有很多信息,但我不能轻易理解是否有一些子进程在分叉中做某种“模糊”并弄得一团糟。
我怎么能弄清楚呢?
示例:ps -elfT | cut -d' ' -f3 | sort |uniq
给我当时正在运行的进程。我如何添加计数以查看每个计数对总数的贡献?