首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么bash函数将参数作为字符串处理?

为什么bash函数将参数作为字符串处理?
EN

Stack Overflow用户
提问于 2015-11-09 22:19:01
回答 1查看 143关注 0票数 0

我正在尝试收集我的ip地址和子网位(例如192.168.2.17/24),以传递给我一个名字来扫描一个网络并创建一组输出文件。我编写了一个包含地址/len和作业名称的工作脚本。我最终希望能够扩展shell脚本,自动提取地址/len,这样我只需要输入作业名。我用的是Mac,如果这有帮助的话。

fing.sh (这很管用!)

代码语言:javascript
复制
#Create a fing profile and scan
mkdir $2
fing -n $1 -r 3 -d false --session $2/persist.fing \
-o table,html,$2/fing.html -o table,csv,$2/fing.csv \
-o table,xml,$2/fing.xml -o table,json,$2/fing.json

test.sh

代码语言:javascript
复制
#!/bin/bash

#Variables
ipaddr=ip
hexmask=netmask
testmask=255.255.252.0
#thing=0

ip和网络掩码功能可以工作,至少它们看起来是这样的。

代码语言:javascript
复制
#Functions
ip()
{   
    ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'    
}

netmask()
{
    ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $4}'      
}

该函数、mask2cidrhex2decip作为单独的脚本工作。

代码语言:javascript
复制
mask2cidr() {
#Source: 
#http://www.linuxquestions.org/questions/programming-9/bash-cidr-calculator-646701/#post3173472
#Convert dotted decimal subnet mask to cidr format
    nbits=0
    IFS=.
    for dec in $1 ; do
        case $dec in
            255) let nbits+=8;;
            254) let nbits+=7;;
            252) let nbits+=6;;
            248) let nbits+=5;;
            240) let nbits+=4;;
            224) let nbits+=3;;
            192) let nbits+=2;;
            128) let nbits+=1;;
            0);;
            *) echo "Error: $dec is not recognised"; exit 1
        esac
    done
    echo "$nbits"
}



hex2decip()
{
#Source:
#https://forums.freebsd.org/threads/ifconfig-display-non-hex-netmasks.2834/#post-86216
#Converts hex formatted subnet to dotted decimal format
if [ ! "$1" ] ; then
        echo
        echo "$MyName - converts an IP address in hexadecimal to dotted decimal" 
        echo "Usage: $MyName <hex_address>"
        echo 
        exit 1
fi

echo $1 | sed 's/0x// ; s/../& /g' | tr [:lower:] [:upper:] | while read B1 B2 B3 B4 ; do                             
        echo "ibase=16;$B1;$B2;$B3;$B4" | bc | tr '\n' . | sed 's/\.$//'                                              
done
}

ipaddr十六进制输出如预期

代码语言:javascript
复制
${ipaddr}
${hexmask}

对于hex2decip十六进制似乎通过了“net掩码”,而不是网络掩码函数的结果。

代码语言:javascript
复制
hex2decip $hexmask


exit 0

./test.sh输出

代码语言:javascript
复制
10.0.180.14
0xffffff00
(standard_in) 1: illegal character: N
(standard_in) 1: illegal character: T
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: K
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-09 22:36:31

代码语言:javascript
复制
hexmask=netmask

将shell变量hexmask设置为字符串netmask。壳就是这样运作的。

如果您想要调用shell函数netmask的结果,则需要使用命令替换:

代码语言:javascript
复制
hexmask=$(netmask)

(当然,在首先定义netmask函数之后。)

顺便说一下,

代码语言:javascript
复制
ipaddr=ip
testmask=255.255.252.0

以同样的方式工作。ipaddr设置为字符串iptestmask设置为字符串255.255.252.0

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33619364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档