Score:3

เชลล์สคริปต์ดำเนินการต่อไปแม้ว่ามันจะเป็นจริงก็ตาม

ธง in

ฉันมีเชลล์สคริปต์อย่างง่ายเพื่อตรวจสอบว่ามีผู้ใช้อยู่หรือไม่ หากไม่มี ให้เพิ่มผู้ใช้นั้น

#!/usr/bin/bash
echo "ป้อนผู้ใช้"
อ่าน -r ผู้ใช้
ถ้า [ "$(id -u "$user" &>/dev/null)" = 1 ]; แล้ว
  echo "มีผู้ใช้แล้ว"
อื่น
  useradd "$user"
  echo "เพิ่มรหัสผ่าน"
  รหัสผ่าน "ผู้ใช้ $"
  echo "$user" &>>text.txt
  เสียงสะท้อน "บันทึก"
ไฟ

แต่มันไม่แสดงผล "ผู้ใช้ echo มีอยู่". แทนที่จะแสดงเช่นนั้น:

ป้อนผู้ใช้

abcdef

useradd: มีผู้ใช้ 'abcdef' อยู่แล้ว

เพิ่มรหัสผ่าน

รหัสผ่านใหม่: 

ในกรณีนี้ abcdef เป็นผู้ใช้ที่มีอยู่

โปรดแจ้งให้เราทราบว่ามีอะไรผิดพลาดที่นี่ ขอบคุณมาก

MatsK avatar
mp flag
เคล็ดลับในการแก้ปัญหา ให้รันคำสั่ง `id -u testuser` และตรวจสอบว่าผลลัพธ์เป็น 1 หรือไม่ เนื่องจาก 1 เป็นสิ่งเดียวที่จะดำเนินการต่อเพื่อ `echo "Userที่มีอยู่"`
raj avatar
cn flag
raj
@MatsK แม้แต่ 1 จะไม่ดำเนินการต่อ เนื่องจากผลลัพธ์จาก `id` ถูกเปลี่ยนเส้นทางไปที่ `/dev/null`
Terrance avatar
id flag
หลังจากตรวจสอบ `id -u $user &>/dev/null` ให้ใช้ `echo $?` และนั่นจะสร้าง 0 หรือ 1 0 หมายถึง `exit code 0` หรือ true, 1 หมายถึง `exit code 1` หรือเป็นเท็จ หรือคุณสามารถมี `if [[ $? == 0 ]]; แล้ว ` ฯลฯ
raj avatar
cn flag
raj
@Terrance มันง่ายกว่าแค่ใช้ `id -u $user &>/dev/null` ทันทีเป็นเงื่อนไขใน `if`
Terrance avatar
id flag
@raj ไม่ใช่ในทุกกรณี การทำเช่นนี้กับคำสั่ง `case` ทำงานได้ดีมาก `id -u` สร้างหมายเลข ID ผู้ใช้ ไม่ใช่ 1 หรือ 0 ดังนั้น การส่ง `id -u` ไปที่ >/dev/null จะกำจัด 1,000 หากนั่นคือ ID ผู้ใช้
raj avatar
cn flag
raj
@Terrance ดูคำตอบของฉันด้านล่าง การใช้คำสั่งโดยตรงเป็นเงื่อนไขเพื่อ `if` (โดยไม่จำเป็น `$(...)`) จะตรวจสอบว่าเป็นรหัสออก ไม่ใช่เอาต์พุต
Terrance avatar
id flag
@raj นั่นก็ใช้ได้เหมือนกัน ของฉันเป็นเพียงวิธีอื่น
Score:9
ธง cn
raj

เงื่อนไขต่อไปนี้ในสคริปต์ของคุณ:

ถ้า [ "$(id -u "$user" &>/dev/null)" = 1 ]; แล้ว

จะไม่มีวันเป็นจริง มันคงเป็นเรื่องจริง เท่านั้น ถ้า เอาต์พุต ของคำสั่ง id -u "ผู้ใช้ $" &>/dev/null จะเป็นเลขหลักเดียว 1 แต่เมื่อเอาต์พุตใดๆ จากคำสั่งนั้นถูกเปลี่ยนเส้นทางไป /dev/nullสิ่งนี้จะไม่เกิดขึ้น

แทนที่บรรทัดนั้นด้วย

ถ้า { id -u "$user" &>/dev/null ; } แล้ว

เงื่อนไขนี้ตรวจสอบ สถานะการออก ของคำสั่ง (และไม่ใช่ของ เอาต์พุต ชอบ $(...) ไม่) และจะเป็นจริงถ้าคำสั่ง id -u "ผู้ใช้ $" &>/dev/null ประสบความสำเร็จ (นั่นคือมีผู้ใช้อยู่) และเป็นเท็จหากมี ล้มเหลว (นั่นคือไม่มีผู้ใช้อยู่)

in flag
ขอบคุณสำหรับคำตอบ มันใช้ได้!!v แต่อะไรคือความแตกต่างระหว่าง [] และ {}?
raj avatar
cn flag
raj
`[` คือ **คำสั่ง** (เทียบเท่ากับ `test`; ดู `man [`) ที่ใช้ตรวจสอบผลลัพธ์ของนิพจน์เงื่อนไขต่างๆ `{}` เป็นเพียงวงเล็บปิดคำสั่ง อันที่จริง เราอาจข้าม `{}` ไปเลย (ในขณะที่คุณ **ไม่สามารถ** ข้าม `[]`): `if id -u "$user" &>/dev/null ; แล้ว' จะทำงานได้ดี แต่อ่านได้น้อยลงเท่านั้น
in flag
ฉันไม่เข้าใจ `[` เป็นคำสั่งเพื่อตรวจสอบค่า ดังนั้นในคำสั่งของฉัน '"$(id -u "$user" &>/dev/null)" = 1` ทำไมมันไม่คืนค่าจริง ฉันหมายความว่า , `"$(id -u "$user" &>/dev/null)"` จะคืนค่า 0 หรือ 1 ใช่ไหม
raj avatar
cn flag
raj
ค่าของ `$(command)` คือ **output** ของคำสั่ง เช่น ข้อความที่คำสั่งพิมพ์ เนื่องจากคุณเปลี่ยนเส้นทางเอาต์พุตนั้นไปที่ `/dev/null` คำสั่งจึงไม่พิมพ์อะไรเลย ดังนั้นค่าของ `$(id -u "$user" &>/dev/null)` จะเป็น **สตริงว่าง** เสมอ คุณเปรียบเทียบสตริงว่างนั้นกับตัวเลข 1 ซึ่งไม่สามารถคืนค่าจริงได้
in flag
`{` และ `}` ไม่จำเป็น `if id -u "$user" &>/dev/null; ก็เพียงพอแล้ว
raj avatar
cn flag
raj
@JanHudec ฉันรู้ แต่รหัสนั้นชัดเจนกว่าด้วย `{}` มีไว้สำหรับสไตล์เท่านั้น :)
Score:2
ธง id

คำตอบโดย @raj นั้นถูกต้อง 100% สำหรับการลดความซับซ้อนของรหัส

นี่เป็นเพียงวิธีอื่นในการใช้รหัสทางออกและอาจทำให้กระจ่างขึ้นเล็กน้อยว่าสามารถใช้รหัสดังกล่าวได้อย่างไร

สามารถตรวจสอบรหัสทางออกได้โดยการทำ ก้อง $? ทันทีหลังจากคำสั่งของคุณ id -u $user &>/dev/null ซึ่งไม่ต้องใส่ $(..) หรืออะไรทำนองนั้น

เพียงแค่พยายามที่ id -u <ชื่อผู้ใช้> &>/dev/null แล้วพิมพ์ ก้อง $? เพื่อตรวจสอบรหัสทางออก

ตัวอย่าง:

terrance@terrance-ubuntu:~$ id -u terrance &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
0
terrance@terrance-ubuntu:~$ id -u เครื่องหมาย &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
1

ในตัวอย่างข้างต้น ผู้ใช้ เครื่องหมาย ไม่มีอยู่ในคอมพิวเตอร์ของฉันดังนั้นสถานะการออกของ 1

การใช้รหัสทางออก คุณสามารถใส่ลงใน กรณี คำสั่งแทน an ถ้า..อื่น คำแถลง.

#!/bin/bash
echo "กรอกชื่อผู้ใช้"
อ่าน -r ผู้ใช้
id -u "ผู้ใช้ $" &>/dev/null
กรณี $? ใน
    0) echo "มีผู้ใช้แล้ว";;
    1) ผู้ใช้เพิ่ม $user
       echo "เพิ่มรหัสผ่าน"
       รหัสผ่าน $user
       echo $user >> text.txt
       echo "บันทึกแล้ว";;
เอสแซค

ที่น่าสนใจคือการใช้ an ถ้า [ ]; แล้ว ยังสามารถใช้งานได้เช่นกันโดยเพิ่ม ก้อง $? ในการตรวจสอบ if ของคุณ แต่ฉันสังเกตเห็นว่าคุณกำลังตรวจสอบ 1 เป็น if มีอยู่ แต่ 1 หมายความว่าไม่พบรหัสที่ออกจาก 1 ความหมาย

การเพิ่มมันก็จะทำงานเช่นนี้เช่นกัน

#!/bin/bash
echo "กรอกชื่อผู้ใช้"
อ่าน -r ผู้ใช้
ถ้า [ $(id -u "$user" &>/dev/null; echo $?) == 0 ]; แล้ว
    echo "มีผู้ใช้แล้ว"
อื่น
    ผู้ใช้เพิ่ม $user
    echo "เพิ่มรหัสผ่าน"
    รหัสผ่าน $user
    echo $user >> text.txt
    เสียงสะท้อน "บันทึก"
ไฟ
in flag
ขอบคุณ ฉันเรียนรู้มากมายจากคำตอบของคุณ แต่ฉันไม่เข้าใจว่าทำไม `echo $` นั่นคืออะไร ??
Terrance avatar
id flag
@ LêQuá»cKhánh บางทีนี่อาจทำให้ `echo $? ตัวแปร
Terrance avatar
id flag
@ LêQuá»cKhánh นอกจากนี้ เมื่อทำการตรวจสอบเป็น `id -u "$user" &>/dev/null; echo $?` ตอนนี้เป็น 2 คำสั่งเป็น 1
in flag
มันเป็นแฮ็คชีวิตสำหรับ shell bash =) ขอบคุณมาก
Terrance avatar
id flag
@LêQuá»cKhánh ยินดีเป็นอย่างยิ่ง!
in flag
ฉันขอถามอะไรคุณอีกได้ไหม ฉันรู้ว่า `&>` จะย้าย stdout และ stderr ไปที่ แต่ในกรณีนี้ทำไมเราต้องย้ายค่าเหล่านี้ไปที่ `/dev/null` สิ่งที่ฉันเข้าใจตอนนี้คือ `id -u "$user" &>/dev/ null` ส่งคืน 0 หรือ 1 จากนั้นย้ายไปที่ `/dev/null` แต่สิ่งที่เราต้องการคือการตรวจสอบ การตรวจสอบคือ 0 หรือ 1 แต่ทำไมเราต้องย้ายไปที่ `/dev/null` ถ้าฉันใช้เฉพาะ ` id -u "$user" &>/dev/null` เกิดอะไรขึ้น จริง ๆ แล้วรหัสนี้มาจากเว็บไซต์ของเราและไม่เข้าใจทั้งหมด
Terrance avatar
id flag
@LêQuá»cKhánh การใช้ `/dev/null` เป็นวิธีการลบ stdout ที่คุณเห็นบนหน้าจอโดยทั่วไป เป็นเพียงวิธีการรักษาความสะอาดของสิ่งของเท่านั้น คุณสามารถรับรหัสทางออกหรือสถานะเดียวกันโดยไม่ต้องใช้ แต่คุณจะเห็นผลลัพธ์ทั้งหมดนั้นบนหน้าจอ และอาจทำให้การใช้รหัสของคุณยากขึ้น อย่าลังเลที่จะทดสอบโค้ดของคุณโดยไม่ต้องใช้ `&>/dev/null` เนื่องจากยังใช้งานได้
Terrance avatar
id flag
@LêQuá»cKhánh 0 และ 1 เป็นเพียงสถานะการออกเท่านั้น หากคุณเรียกใช้ `id -u $user` โดยไม่มีสิ่งใดตามมา ระบบจะสร้างหมายเลข ID ผู้ใช้ เช่นเดียวกับชื่อผู้ใช้ของฉันสร้าง 1,000 เนื่องจากเป็นหมายเลขประจำตัวผู้ใช้ของฉัน แต่ถ้าฉันพิมพ์ `echo $?` หลังจากคำสั่งนั้น มันจะยังคงสร้าง 0 เนื่องจากสถานะการออกผ่านไปแล้ว
in flag
ขอบคุณมาก
in flag
ฉันแค่พยายามเข้าสู่ระบบโดย `user1="$(id -u "$user")"` และ `echo "User is $user1"` และกลับเป็น 1007 หมายความว่าอย่างไร
Terrance avatar
id flag
@LêQuá»cKhánh `id -u` สร้าง UID หรือหมายเลข ID ผู้ใช้ไม่ใช่สถานะการออก คุณต้องเรียกใช้ `echo $?` เป็นคำสั่งถัดไปเพื่อดูว่าสถานะการออกของคำสั่ง `id -u` คืออะไร
in flag
ฉันเข้าใจแล้ว ขอบคุณมาก

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา