كيفية قراءة mutliline المدخلات من stdin في متغير و كيفية طباعة واحد في شل(sh,باش)?

StackOverflow https://stackoverflow.com/questions/212965

  •  03-07-2019
  •  | 
  •  

سؤال

ما أريد القيام به هو ما يلي:

  1. قراءة في خط متعددة المدخلات من stdin في متغير A
  2. إجراء العمليات المختلفة على A
  3. الأنابيب A دون أن تفقد محدد الرموز (\n,\r,\tالخ) إلى آخر الأوامر

المشكلة الحالية هي التي لا أستطيع قراءتها مع read الأمر, لأنه توقف عن القراءة في السطر.

يمكنني قراءة ستدين مع cat, مثل هذا:

my_var=`cat /dev/stdin`

, لكني لا أعرف كيفية الطباعة.بحيث السطر علامة التبويب وغيرها من المحددات لا تزال هناك.

نموذج بلدي النصي يبدو مثل هذا:

#!/usr/local/bin/bash

A=`cat /dev/stdin`

if [ ${#A} -eq 0 ]; then
        exit 0
else
        cat ${A} | /usr/local/sbin/nextcommand
fi
هل كانت مفيدة؟

المحلول

هذا العمل بالنسبة لي:

myvar=`cat`

echo "$myvar"

ونقلت حول $myvar هامة.

نصائح أخرى

في باش هناك بديل ؛ man bash يذكر:

الأمر الاستبدال $(cat file) يمكن استبدال أي ما يعادل ولكن بشكل أسرع $(< file).

$ myVar=$(</dev/stdin)
hello
this is test
$ echo "$myVar"
hello
this is test

المحملة لا وظيفة

#!/bin/bash
myVar=$(tee)

نعم يعمل بالنسبة لي أيضا.شكرا

myvar=`cat`

هو نفس

myvar=`cat /dev/stdin`

نعم.من bash رجل الصفحة:

أرفق الأحرف بين علامات اقتباس مزدوجة يحافظ على القيمة الحرفية من كل الشخصيات داخل الاقتباس ، باستثناء $, `, \, و, عندما تاريخ التوسع تمكين !.الشخصيات دولار ، ` تحتفظ معنى خاص داخل علامات اقتباس مزدوجة.

إذا كنت لا يهتمون بالحفاظ على زائدة أسطر في نهاية إخراج استخدام هذا:

myVar=$(cat; echo x)
myVar=${myVar%x}
printf %s "$myVar"

هذا يستخدم خدعة من هنا.

[تحديث]

هذه المهمة سوف معلقة إلى أجل غير مسمى إذا كان هناك أي شيء في الأنابيب...

var="$(< /dev/stdin)"

يمكننا منع هذا على الرغم من القيام مهلة read على الحرف الأول.إذا كان مرات ، رمز الإرجاع سوف يكون أكبر من 128 و سوف تعرف ستدين الأنابيب (أ.ك.a /dev/stdin) فارغة.

خلاف ذلك, نحصل على بقية ستدين من قبل...

  • الإعداد IFS إلى NULL فقط read الأمر
  • إيقاف يهرب مع -r
  • القضاء على القراءة محدد مع -d ''.
  • وأخيرا إلحاق ذلك الحرف علينا في البداية

وهكذا...

__=""
_stdin=""

read -N1 -t1 __  && {
  (( $? <= 128 ))  && {
    IFS= read -rd '' _stdin
    _stdin="$__$_stdin"
  }
}

هذا الأسلوب يتجنب استخدام var="$(command ...)" استبدال الأوامر التي, تصميم, دائما تجريدها من أي زائدة أسطر.

إذا كان الأمر البديل المفضل ، للحفاظ على زائدة أسطر يمكننا إلحاق واحد أو أكثر من محدد الشخصيات إلى الإخراج داخل $() ثم تجريدهم من خارج.

على سبيل المثال ( ملاحظة $(parens) في أول الأمر ، ${braces} في الثانية )...

_stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
_stdin="${_stdin%|||}"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top