แก้ไขแล้ว ( 2014-06-01 2018-01-09)
สำหรับการตั้งค่าที่แข็งแกร่งกับการเชื่อมต่อจำนวนมากและหลาย IP กำหนดค่าบนอินเตอร์เฟซที่แต่ละผมเขียนทุบตีบริสุทธิ์สคริปต์ (ไม่อยู่บนพื้นฐาน127.0.0.1) สำหรับการค้นหาอินเตอร์เฟซที่ถูกต้องและ IP, default routeขึ้นอยู่กับ ฉันโพสต์สคริปต์นี้ที่ด้านล่างสุดของคำตอบนี้
Intro
ในฐานะที่เป็นทั้งระบบปฏิบัติการมี ทุบตี ติดตั้งโดยค่าเริ่มต้นมีเคล็ดลับทุบตีสำหรับ Mac และ Linux:
ปัญหาโลแคลได้รับการป้องกันโดยการใช้LANG=C:
myip=
while IFS=$': \t' read -a line ;do
    [ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
        [ "${ip#127.0.0.1}" ] && myip=$ip
  done< <(LANG=C /sbin/ifconfig)
echo $myip
การนำสิ่งนี้มาเป็นฟังก์ชั่น:
น้อยที่สุด:
getMyIP() {
    local _ip _line
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && echo $_ip && return 0
      done< <(LANG=C /sbin/ifconfig)
}
ใช้ง่าย:
getMyIP
192.168.1.37
เรียบร้อยแฟนซี:
getMyIP() {
    local _ip _myip _line _nl=$'\n'
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && _myip=$_ip
      done< <(LANG=C /sbin/ifconfig)
    printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}
การใช้งาน:
getMyIP
192.168.1.37
หรือใช้ฟังก์ชันเดียวกัน แต่มีอาร์กิวเมนต์:
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
หมายเหตุ:โดยไม่ต้องโต้แย้งเอาท์พุทฟังก์ชั่นนี้ใน STDOUT, ทรัพย์สินทางปัญญาและการขึ้นบรรทัดใหม่ด้วยการโต้แย้งไม่มีอะไรจะพิมพ์ แต่ตัวแปรชื่อเป็นอาร์กิวเมนต์จะถูกสร้างขึ้นและมี IP โดยไม่ต้องขึ้นบรรทัดใหม่
Nota2:สิ่งนี้ได้รับการทดสอบบน Debian, LaCie ที่ถูกแฮ็ก nas และ MaxOs หากสิ่งนี้ไม่ได้ผลภายใต้สภาพแวดล้อมของคุณฉันจะสนใจด้วยการดึงข้อมูลกลับมา!
รุ่นเก่าของคำตอบนี้
(ไม่ถูกลบเพราะอ้างอิงsedไม่ใช่bash)
เตือน: มีปัญหาเกี่ยวกับตำแหน่งที่ตั้ง!
เร็วและเล็ก:
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
ระเบิด (ทำงานด้วย;)
myIP=$(
    ip a s |
    sed -ne '
        /127.0.0.1/!{
            s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
        }
    '
)
แก้ไข:
วิธี! ดูเหมือนว่าจะไม่ทำงานบนMac OS ...
ตกลงดูเหมือนว่าจะใช้งานได้ดีบนMac OSเหมือนกับบนLinux :
myIP=$(LANG=C /sbin/ifconfig  | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p; }')
splitted:
myIP=$(
    LANG=C /sbin/ifconfig  |
        sed -ne $'/127.0.0.1/ ! {
            s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p;
        }')
สคริปต์ของฉัน (มกราคม 2018):
สคริปต์นี้จะค้นหาเส้นทางเริ่มต้นและส่วนต่อประสานที่คุณใช้ก่อนจากนั้นค้นหาเครือข่ายการจับคู่ไอพีท้องถิ่นของเกตเวย์และเติมตัวแปร สองบรรทัดสุดท้ายเพิ่งพิมพ์สิ่งที่ชอบ:
Interface   : en0
Local Ip    : 10.2.5.3
Gateway     : 10.2.4.204
Net mask    : 255.255.252.0
Run on mac  : true
หรือ
Interface   : eth2
Local Ip    : 192.168.1.31
Gateway     : 192.168.1.1
Net mask    : 255.255.255.0
Run on mac  : false
ก็มี:
#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
        $(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%u" $(( _a<<24 |
                  ${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
    [ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
    if $runOnMac ;then
        case $a in 
            gateway )    gWay=$b  ;;
            interface )  iFace=$b ;;
        esac
    else
        [ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
    fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
    [ "$lhs" ] && { 
        [ -z "${lhs#*:}" ] && iface=${lhs%:}
        [ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
            mask=${rhs#*netmask }
            mask=${mask%% *}
            [ "$mask" ] && [ -z "${mask%0x*}" ] &&
                printf -v mask %u $mask ||
                ip2int $mask mask
            ip2int ${rhs%% *} ip
            (( ( ip & mask ) == ( gw & mask ) )) &&
                int2ip $ip myIp && int2ip $mask netMask
        }
    }
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
       Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac