我正在使用getopts所有需要高级选项解析的脚本,并且它与dash. 我熟悉标准的基本getopts用法,包括[-x]和[-x OPTION]。
是否可以解析这样的选项?
dash_script.sh FILE -x -z -o OPTION
## Or the inverse?
dash_script.sh -x -z -o OPTION FILE
Run Code Online (Sandbox Code Playgroud) Bash 快把我逼疯了。我无法弄清楚为什么以下内容(也不是我从示例中逐字复制和粘贴的数十种变体中的任何一种)都无法正常工作:
#!/bin/bash
echo $#
function main {
if (( $# < 1 )); then
usage
fi
echo "good"
}
function usage {
echo "Usage: $0 <outputdir>"
exit 1
}
main
Run Code Online (Sandbox Code Playgroud)
由于某种原因,参数检查每次都失败,即使我传递了一个参数并且可以清楚地看到$#按预期设置。
我有一个文件,其中包含随时间更新的数据 (mydata)。该文件如下所示:
1 2 3
Run Code Online (Sandbox Code Playgroud)
有了这个文件,我想这样做(基本上将每个数字作为单独的参数处理):
myscript.sh 1 2 3
Run Code Online (Sandbox Code Playgroud)
由于数据不是静态的而是随着时间的推移更新,我想运行这个命令:
myscript.sh "$(cat mydata)"
Run Code Online (Sandbox Code Playgroud)
但是我看到 ./myscript.sh: line 1: 1: command not found
我该怎么办?
我的shell脚本:
#!/bin/bash
echo "$1";
startd=$(date -d "$1" +"%Y%m%d");
echo "$startd";
Run Code Online (Sandbox Code Playgroud)
我的命令:
须藤 ./test.sh "20151010"
输出:
20151010
20150213
Run Code Online (Sandbox Code Playgroud)
它打印今天的日期而不是打印输入日期有什么想法吗?
我需要将参数扩展作为程序参数传递。扩展导致文件名带有空格。因此,我用双引号将文件名作为一个单词:"$var".
只要$var包含文件名,程序就会得到一个单字参数并且它工作正常。但是,有时扩展会导致空字符串,当作为参数传递时,会破坏程序(我无法更改)。
根据 Bash 参考手册,不删除空字符串是指定的行为:
如果没有值的参数在双引号内展开,则结果为空参数并保留。
但是,我如何管理需要引用变量但也需要丢弃空字符串扩展的情况?
编辑:
感谢 George Vasiliou,我发现我的问题中缺少一个细节(只是尽量保持简短:))。运行程序是一个很长的java调用,缩写如下:
java -cp /etc/etc MyClass param1 param2 "$var" param4
Run Code Online (Sandbox Code Playgroud)
事实上,使用if乔治所描述的语句就可以解决问题。但是它需要一个在then子句中带有“$var”的调用,另一个在子句中没有“$var” else。
为了避免重复,我想看看是否有一种方法可以使用单个调用来丢弃“$var”为空时的扩展。
在处理脚本时,以下脚本出错
file * | awk '{ ${1}=""; print substr(${0},2) }';
Run Code Online (Sandbox Code Playgroud)
虽然以下两个脚本都成功运行
file * | awk '{ $"1"=""; print substr($"0",2) }';
Run Code Online (Sandbox Code Playgroud)
和
file * | awk '{ $1=""; print substr($0,2) }';
Run Code Online (Sandbox Code Playgroud)
不$1, ${1}, $"1"都是参数替换吗?我的awk语法有问题吗?
给定一个包含以下内容的目录:
note 1.txt, 昨天最后修改note 2.txt,上次修改前天note 3.txt,今天最后修改获取数组的最佳方法是什么note 3 note 1 note 2?
为了定义“最佳”,我更关心稳健性(在 macOS 中的 ZSH 上下文中),而不是效率和可移植性。
预期的用例是一个包含数百或数千个纯文本文件的目录,但是——冒着混淆问题的风险——这是我有一个更普遍的问题的一个特定案例,在文件路径上执行字符串操作的最佳实践是什么由命令打印喜欢ls,find,和mdfind。
我一直在使用一个调用此命令的宏来实现上述目的:
ls -t | sed -e 's/.[^.]*$//'
Run Code Online (Sandbox Code Playgroud)
它从来没有失败过,但是:
ls. (解析ls;实践,在“5. 永远不要做这些”下)。sed在参数扩展会做的地方调用效率低下吗?使用find(用 NUL 字符而不是换行符安全地分隔文件路径)和参数扩展来提取基本名称,这会产生一个未排序的列表:
find . -type f -print0 | while IFS= read -d '' -r l ; do print "${${l%.*}##*/}" ; done
Run Code Online (Sandbox Code Playgroud)
但是按修改日期排序似乎需要调用stat …
我们如何创建一个 unix name 的空文件-stuff。这意味着名称以-. 我试过了,touch -stuff但没有用。
我正在编写脚本并在usage()函数中指定用法。我的脚本使用 option1 或 option2 或两者。其中之一是强制性的。
有没有标准的写法?
我知道有*.conf文件/usr/lib/sysctl.d和/或/etc/sysctl.d文件夹准备在启动时建立内核参数。但它们是通用的;我想要的是net.ipv4.icmp_echo_ignore_all根据所在的用户自定义其中一些参数(例如,),但我想要每个用户的内核参数。有可能吗,或者我所说的完全是愚蠢的?