我在shell脚本中遇到问题.我缩小了问题的范围,发现这是因为标准输入的文件描述符不是在proc文件系统中生成的.下面是我编写的测试脚本:
#!/bin/ksh
var=`ls -lrt /proc/$$/path/0`
echo $var
if [[ -f /proc/$$/path/0 ]]
then
echo "found file descriptor"
else
echo "file descriptor not found"
fi
Run Code Online (Sandbox Code Playgroud)
我在/ tmp /目录中使用示例输入文件对此进行了测试:
$ ./checkip.sh < /tmp/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/19358/path/0 -> /tmp/testip
found file descriptor
Run Code Online (Sandbox Code Playgroud)
现在我在我们遇到问题的目录中进行了测试.
$ ./checkip.sh < /var/opt/xxxxxxxx/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/20124/path/0
file descriptor not found
$
Run Code Online (Sandbox Code Playgroud)
我想可能是目录xxxxxxxx.所以我再次使用父目录中的文件对此进行了测试.
$ ./checkip.sh < /var/opt/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:16 /proc/21286/path/0 -> /var/opt/testip …Run Code Online (Sandbox Code Playgroud) 可以说我有一个如下文件:
我想将所有十进制数存储在哈希中.
hello world 10 20
world 10 10 10 10 hello 20
hello 30 20 10 world 10
Run Code Online (Sandbox Code Playgroud)
我在看这个
这工作得很好:
> perl -lne 'push @a,/\d+/g;END{print "@a"}' temp
10 20 10 10 10 10 20 30 20 10 10
Run Code Online (Sandbox Code Playgroud)
那么我需要的是计算每个正则表达式的出现次数.
为此我认为最好将所有匹配存储在哈希中,并为每个键分配一个递增值.
所以我试过了:
perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
Run Code Online (Sandbox Code Playgroud)
这给了我一个输出:
> perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
10.4
20.7
Run Code Online (Sandbox Code Playgroud)
不管我错了,有人能纠正我吗?
我期望的输出是:
10.7
20.3
30.1
Run Code Online (Sandbox Code Playgroud)
虽然我可以在awk中执行此操作,但我只想在perl中执行此操作
输出的顺序也不是我关心的问题.
我正在研究solaris unix.我有两个文件:
> cat temp
2
8
6
> cat temp2
1
2
3
4
5
6
7
8
9
>
Run Code Online (Sandbox Code Playgroud)
现在我需要temp2中存在的temp2中的所有行:我遇到了这个并尝试了下面的命令.
> nawk 'FNR==NR{a[$0];next}($1 in a)' temp temp2
2
6
8
>
Run Code Online (Sandbox Code Playgroud)
这完美地运作了.然后我也看到了在这里使用join的方式,
其中的内容(以及手册页)"默认情况下,当我们没有明确指定字段编号时,join命令匹配第一个字段上的文件"所以我认为如果我给join temp temp2我,我会得到
2
6
8
Run Code Online (Sandbox Code Playgroud)
但是我得到了!
> join temp temp2
2
8
>
Run Code Online (Sandbox Code Playgroud)
如果默认加入匹配第一列,有人可以告诉我为什么6会丢失吗?
我有简单的perl脚本如下:
#!/usr/bin/perl
use strict;
use Data::Dumper;
my %x;
$x{"a"}="b";
$x{"b"}={'c'=>3,'d'=>4};
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}};
print Dumper(%x);
Run Code Online (Sandbox Code Playgroud)
这输出如下:
> ./temp.pl
$VAR1 = 'c';
$VAR2 = {
'e' => {
'g' => 6,
'f' => 5
},
'h' => {
'j' => 8,
'i' => 7
}
};
$VAR3 = 'a';
$VAR4 = 'b';
$VAR5 = 'b';
$VAR6 = {
'c' => 3,
'd' => 4
};
,
Run Code Online (Sandbox Code Playgroud)
但我想要的输出是不同的.所以我尝试了下面的代码:
#!/usr/bin/perl
use strict;
use Data::Dumper;
my %x;
$x{"a"}="b";
$x{"b"}={'c'=>3,'d'=>4};
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}};
foreach (keys %x )
{
if(ref($x{$_}) …Run Code Online (Sandbox Code Playgroud) 我在一些脚本中看到有一个连接到shell变量的连字符.例如:
if [ -z ${X-} ]
Run Code Online (Sandbox Code Playgroud)
变量旁边的这个连字符符号在这里做什么.我在网上找不到任何相关文档.