我正在编写一个shell脚本,在AIX上的KornShell(ksh)下运行.我想使用该mkdir命令创建一个目录.但目录可能已经存在,在这种情况下我不想做任何事情.因此,我想测试以查看该目录不存在,或者抑制在mkdir尝试创建现有目录时抛出的"File exists"错误.
有关如何最好地做到这一点的任何想法?
要将命令的输出存储为sh/ksh/bash中的变量,您可以执行任一操作
var=$(command)
Run Code Online (Sandbox Code Playgroud)
要么
var=`command`
Run Code Online (Sandbox Code Playgroud)
两种方法之间有什么区别?
我有一个ksh脚本,它返回一长串值,换行符分隔,我想只看到唯一/不同的值.有可能这样做吗?
例如,假设我的输出是目录中的文件后缀:
Run Code Online (Sandbox Code Playgroud)tar gz java gz java tar class class
我希望看到如下列表:
Run Code Online (Sandbox Code Playgroud)tar gz java class
我有一个脚本,exit如果它被采购我不希望它调用.
我想过检查是否$0 == bash但如果脚本来自另一个脚本,或者如果用户从不同的shell中获取它,则会出现问题ksh.
是否有可靠的方法来检测脚本是否来源?
我的命令输出类似于:
1540 "A B"
6 "C"
119 "D"
Run Code Online (Sandbox Code Playgroud)
第一列始终是数字,后跟空格,然后是双引号字符串.
我的目的是仅获得第二列,例如:
"A B"
"C"
"D"
Run Code Online (Sandbox Code Playgroud)
我打算用它<some_command> | awk '{print $2}'来完成这个.但问题是,第二列中的某些值包含空格,这恰好是分隔awk字段的默认分隔符.因此,输出搞砸了:
"A
"C"
"D"
Run Code Online (Sandbox Code Playgroud)
如何干净地获得第二列的值(带配对的引号)?
我只是想了解shell中的以下代码行.它用于获取当前工作目录.我知道$(variable)名称返回变量名称中的值,但$(command)应该返回什么?它在执行命令后返回值吗?在这种情况下,我们可以`用来执行命令.
CWD="$(cd "$(dirname $0)"; pwd)"
Run Code Online (Sandbox Code Playgroud)
在不同版本的shell中也可以从以下代码行获取相同的输出
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Run Code Online (Sandbox Code Playgroud)
我无法理解的含义$(cd..和$(dirname.
有人可以帮我弄清楚这个命令是如何执行的吗?
我有两个文件(file1.txt和file2.txt),文件只是示例.
如何合并这两个文件,以便创建文件 - merge_files.txt作为示例3
我现在写的是ksh脚本,所以可以用ksh,awk,sed,perl one liner等完成合并
背景 - 为什么我需要合并文件:我的目标是将OLD文件(存在于第一个字段中)重命名为NEW文件(存在于第二个字段中),
例1
more file1.txt
/etc/port1-192.9.200.1-255.555.255.0
/etc/port2-192.9.200.1-255.555.255.0
/etc/port3-192.9.200.1-255.555.255.0
/etc/port4-192.9.200.1-255.555.255.0
/etc/port5-192.9.200.1-255.555.255.0
.
.
.
.
Run Code Online (Sandbox Code Playgroud)
例题
more file2.txt
/etc/port1-192.90.2.1-255.555.0.0
/etc/port2-192.90.2.1-255.555.0.0
/etc/port3-192.90.2.1-255.555.0.0
/etc/port4-192.90.2.1-255.555.0.0
/etc/port5-192.90.2.1-255.555.0.0
.
.
.
.
Run Code Online (Sandbox Code Playgroud)
示例3
more merge_files.txt
/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0
/etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0
/etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0
/etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0
/etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0
.
.
.
.
.
Run Code Online (Sandbox Code Playgroud)
example4(merge_files.txt结构)
first field second field
OLD file NEW file
Run Code Online (Sandbox Code Playgroud) 我不是*nix的新手,不过最近我在提示时花了很多时间.我的问题是使用KornShell(ksh)或Bash Shell有什么好处?使用其中一个的陷阱在哪里?
希望从用户的角度理解,而不是纯粹的脚本.
理想情况下,我可以使用像这样的程序
find [file or directory name]
Run Code Online (Sandbox Code Playgroud)
报告具有匹配文件名/目录的路径.不幸的是,这似乎只检查当前目录,而不是整个文件夹.
我也尝试过找到哪个,但是没有找到文件,即使我知道它在某个地方的计算机上.
我想写这样的代码:
command="some command"
safeRunCommand $command
safeRunCommand() {
cmnd=$1
$($cmnd)
if [ $? != 0 ]; then
printf "Error when executing command: '$command'"
exit $ERROR_CODE
fi
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码并没有按照我想要的方式运行.哪里弄错了?